2016-03-02 5 views
8

から選択した項目の更新リサイクラービューに必要な提案。私の要件は次のとおりです: - 私は2つの配列を与えるWebサービスを呼び出す必要があります。 1つはリストに表示する必要のあるデータです。この目的のために、私はRecyclerViewを使用しています。他の配列はステータスです。これはスピナーで表示しています。このWebサービスはページ番号が付けられています。私は改ページを追加して、うまくいきます。 - ユーザーがスピナーから他の要素を選択すると、再びWebサービスコールを作成し、リサイクルビューのデータを変更する必要があります。アンドロイド:私はリサイクルビューに新しいですスピナー

mAccountListingsAdapter.notifyItemRangeInserted(mAccountListingsAdapter.getItemCount(), mListings.size() - 1); 

をそして、私はスピナーからデータを変更すると、私は次のことをやっている:私は連続したページからより多くのデータを得れば は現在、ページネーションの場合には、私は、次のことをやって

mListings.clear();//Clear the data set 

mAccountListingsAdapter.notifyDataSetChanged();//Call notify data set changed on recycler view adapter 

getAccountListings();//Fetch new data from the web service and display in recycler view 

しかし、リサイクラ・ビュー・アダプタでnotifyDataSetChanged()を直接呼び出すのではなく、特定のnotifyXXXメソッドをコールして、パフォーマンスとアニメーションの問題を回避する必要があります。

私はスピナーのonItemSelected()にリサイクルビューアダプタを通知する権利をやっている、またはそれを変更しなければならないのであれば、私は、疑いの下にいます。

P.S.

int size = mListings.size(); 
mListings.clear(); 
mAccountListingsAdapter.notifyItemRangeRemoved(0, size - 1); 

しかし、それはクラッシュし、次の例外を除いて:私はonItemSelectedに、次の試してみました

03-02 12:59:41.046: E/AndroidRuntime(4270): java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 4(offset:0).state:5 

答えて

4

私はnotifyItemRangeRemovedがここで使用する正しい方法だと思いますが、値が2番目のパラメータに渡しています間違っている。ドキュメントごとに、2番目のパラメータはデータセットから削除されたアイテムの数です。渡すものは最後に削除されたアイテムの位置です。

enter image description here

ので、以下のコードを参照してください。詳細情報については細かい

int size = mListings.size(); 
mListings.clear(); 
mAccountListingsAdapter.notifyItemRangeRemoved(0, size); 

を動作するはずです:すべてのhttp://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyItemRangeRemoved(int,%20int)

+0

+1私のミスアビシェーク - 私は私の答えを書き始め、最終的にそれを投稿する前に休憩を取りました。その間に他の誰かが回答を投稿したかもしれないということは私には起こりませんでした。今のところ、私はそれが提供する他の情報のために答えを掲載し続けます。 @Vikram確かに。 – Vikram

+0

問題ない。 –

1

まず、notifyItemRangeRemoved (int, int)ためのメソッド定義は次のとおりです。

public final void notifyItemRangeRemoved (int positionStart, int itemCount) 

第2引数i s countではなく、positionEndです。あなたのケースでは、それ自体がsizeであるべきときに、size - 1を第2引数として渡しています。

int size = mListings.size(); 
mListings.clear(); 
// should be notifyItemRangeRemoved(0, size) 
mAccountListingsAdapter.notifyItemRangeRemoved(0, size - 1); 

第二に、notifyDataSetChanged()は、それがすべての可視のビューの再バインドおよび再レイアウトをトリガするために眉をひそめています。あなたの場合、目に見えるアイテムの数がゼロの場合、なぜnotifyDataSetChanged()がパフォーマンスを低下させるのか分かりません。アイテムのアニメーションを作成する場合は、notifyItemRangeRemoved(0, size)に行ってください。それ以外の場合は、ここでnotifyDataSetChanged()を使っても構いません。

関連する問題