2013-10-15 28 views
9

私はStackViewに基づいたアプリケーション用のウィジェットで作業していて、いくつかの項目を表示する必要があります。アイテムの数は、ユーザーの操作によって異なる場合があります。これは何らかのお気に入りメニューです。私はStackViewのためのビューを生成するためにRemoteViewsFactory子孫を実装している:空のデータセットのときにRemoteViewsFactoryがgetViewAtを呼び出しました

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 
} 

すべては最初のウィジェットの起動時にうまく機能 - ウィジェットが正常に空のビューが表示され、すべてがうまくいけ。

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

すべてが、この時点でもある - データセットが正常に変更し、私は、ウィジェット上で私のお気に入りの項目を参照してください。私はお気に入りにいくつかの新しい要素を追加した後、私はすぐにAppWidgetManagerに通知します。しかし、私はお気に入りから私の単一の要素を削除して、お気に入り(AppWidgetManagerはもちろんの通知)私は私のgetViewAtMethodにはIndexOutOfBoundsExceptionを受ける空になったとき:何onDataSetChanged()火災後getCount()戻り、私がチェックしたすべての

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

まず - それは0でしたなぜRemoteViewsFactorygetCount()に0を返すのかをRemoteViewsFactoryと呼ぶ理由は分かりません。私が理解する限り、RemoteViewFactoryは通常のアダプタのようなものです。この動作は完全に混乱しています。だから私の提案は間違っていると私は何か間違っている?

UPDATE
今日、私はいくつかのGUIのバグを修正しようとしているときにListViewの代わりStackViewを使用するように私のウィジェットのレイアウトを変更しました。そして、今はすべてうまくいく。さらなる実験では、AdapterViewFlipperにStackViewと同じ問題があることが示されています。私が理解する限り、いくつかの側面が子孫と働いていますAdapterViewAnimator - 誰も私の前提を確認/否定できますか?

+1

上で適切にビューを返すことを確認したが、私は上で実行するために起こる:一部の開発者は今のところ...それは「ハック」

を呼び出します同じ問題。データセットは更新されますが、RemoteViewsFactoryは古い値の「getCount」を使用しています。あなたは他の何かを見つけましたか? – mdelolmo

+0

@mdelolmo残念ながら、私はこの問題の解決策を見つけられず、< and >ボタンを使用してアイテムを1つだけ表示してナビゲートするウィジェットを修正しました。 – Viacheslav

+0

下記の答えは私のためにこの問題を解決しました。これは回避策ですが、素敵なものです。 –

答えて

10

ここに同じ問題があります。解決策はまだ出ていないので(Android 4.4をここでもやっていますが)、今のところ最高の解決策は、基本的にクラッシュを回避するための回避策だと思います。

public RemoteViews getViewAt(int position) { 

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

あなたは、私はこれはかなり古いです知っgetLoadingView()

+1

これは私のために働いた。それはもうクラッシュしません(これまでのところ)、そしてこのケースをスキップし、私がとにかく望んでいた "空の"ウィジェットビューを表示しているようです。しかし、これはStackViewsだけで問題になるのだろうか? – Nlinscott

関連する問題