2013-10-15 41 views
9

StackView'e dayanan ve bazı öğeleri görüntülemen uygulamam için uygulamam üzerinde çalışıyorum. Öğelerin sayısı kullanıcı eylemleri nedeniyle değişebilir - bunun bir çeşit favori menü olduğunu söyleyelim. Ben StackView için görüşlerini oluşturmak için RemoteViewsFactory torunuyum uygulamış:RemoteViewsFactory, boş veri kümesi olduğunda getViewAt olarak adlandırıldı

public class StackRemoteViewsFactory implements RemoteViewsFactory { 

    private List<Item> data; 
    private Context context; 

    public StackRemoteViewsFactory(Context context) { 
     this.context = context; 
     data = new DAO(context).getFavouriteCards(); 
    } 

    @Override 
    public void onDataSetChanged() { 
     data = new DAO(context).getWidgetItems(); // refresh widget dataset 
    } 

    @Override 
    public int getCount() { 
      return data.size(); 
    } 

    @Override 
    public RemoteViews getViewAt(int position) { 
     Item item = data.get(position); 
     // this is my problem and will be explained below - 
     // here I'm getting IndexOutOfBoundsException, position = 0 

      ... 
    } 
    // I have omitted other methods to avoid verbosity 
} 

Tüm birinci Widget başında iyi çalışır - Widget başarıyla boş görünümü görüntüler ve her şey iyi gidiyor.

AppWidgetManager widgetManager = AppWidgetManager.getInstance(getActivity()); 
ComponentName component = new ComponentName(getActivity(), MyWidgetProvider.class); 
int[] widgetIds = widgetManager.getAppWidgetIds(component); 
widgetManager.notifyAppWidgetViewDataChanged(widgetIds, R.id.widgets_stack); 

Tüm bu noktada iyi olduğunu - veri kümesi başarıyla değiştirildi ve ben widget'ındaki benim favori ifade göreceksiniz: Ben sık kullanılanlara bazı yeni eleman katma sonra ben hemen AppWidgetManager bildirin. Ama favorilerden benim tek öğe kaldırmak ve sık (AppWidgetManager elbette bildirilir) Benim getViewAtMethod içinde IndexOutOfBoundsException almak boş olunca: Ne onDataSetChanged() yangınlardan sonra getCount() döner ben kontrol ettik hepsinden

10-15 17:26:36.810: E/AndroidRuntime(30964): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 

Birinci 0 - oldu Bu yüzden'un numaralı telefonu neden getCount() döndürdüğünü anlamıyorum. Anladığım kadarıyla, RemoteViewFactory normal bir bağdaştırıcı gibidir, bu nedenle bu davranış tamamen kafa karıştırıcıdır. Belki bu konuda benim önerim yanlış ve yanlış bir şey yapıyorum?

GÜNCELLEME
Bugün bazı GUI hata düzeltmek isterken ListView yerine StackView kullanmak benim Widget düzenini değiştirdik. Ve şimdi her şey iyi çalışıyor. Daha fazla deney, AdapterViewFlipper'un StackView ile aynı sorunu gösterdiğini gösterir. Anladığım kadarıyla, AdapterViewAnimator soyundan gelen bazı yönler var - herkes benim varsayımı onaylayabilir mi/reddedebilir mi?

+1

düzgün bir görünüm dönmek emin olun, ama üzerinde çalıştırmak için ne: Bazı Devs Şimdilik ... o "kesmek"

arayacak aynı sorun. Veri kümesi güncelleştirildi, ancak bir şekilde RemoteViewsFactory eski bir "getCount" değeri kullanıyor. Başka bir şey buldun mu? – mdelolmo

+0

@mdelolmo Maalesef bu sorun için çözüm bulamadım ve widget'ımı tek bir öğeyi görüntülemek için yeniden çalıştırdım ve < and > düğmelerini kullanarak öğeler arasında gezinin. – Viacheslav

+0

Aşağıdaki cevap benim için bu sorunu çözdü. Bu bir geçici çözüm, ama güzel bir :) –

cevap

10

Aynı sorun burada. Çözüm henüz gelmediğinden (Android 4.4 burada ve hala gerçekleşiyor), şu an için en iyi çözümün temel olarak çökmeyi önlemek için bir çözüm olduğunu düşünüyorum.

public RemoteViews getViewAt(int position) { 

    if (position >= getCount()) 
      return getLoadingView(); 
    } 
    //.... Rest of your normal configuration 
} 

ben bu oldukça eski olduğunu biliyoruz getLoadingView()

+1

Bu benim için çalıştı. Artık (şimdiye kadar) çökmez ve bu davanın üzerine atlamak ve "boş" widget görünümünü göstermek istedim, bu da istediğim şey. Yine de, bu sadece StackViews ile bir sorun olup olmadığını merak ediyorum? – Nlinscott