我是回收者视图的新手。我的要求如下:
- 我必须调用一个可以提供两个数组的Web服务。一个有我需要在列表中显示的数据。为此,我使用RecyclerView
。另一个数组是状态,我在spinner中显示。此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
但是,建议不要直接在recycler视图适配器上调用notifyDataSetChanged(),而应调用特定的notifyXXX方法,以避免性能和动画问题。
所以,我有疑问,如果我正确地通知spinner的onItemSelected()
中的recycleler视图适配器,或者它应该被更改。
P.S。我尝试在onItemSelected
:
int size = mListings.size();
mListings.clear();
mAccountListingsAdapter.notifyItemRangeRemoved(0, size - 1);
然后它崩溃了,但有以下例外:
03-02 12:59:41.046: E/AndroidRuntime(4270): java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 4(offset:0).state:5
答案 0 :(得分:4)
我认为notifyItemRangeRemoved
是在这里使用的正确方法,但是您为第二个参数传递的值是错误的。根据文档,第二个参数是从数据集中删除的项目数,您传递的是最后一个项目的删除位置。
所以下面的代码应该可以正常工作
int size = mListings.size();
mListings.clear();
mAccountListingsAdapter.notifyItemRangeRemoved(0, size);
答案 1 :(得分:1)
首先,notifyItemRangeRemoved (int, int)
的方法定义是:
public final void notifyItemRangeRemoved (int positionStart, int itemCount)
第二个参数是count
,而不是positionEnd
。在你的情况下,你传递size - 1
作为第二个参数,它应该是size
本身。
int size = mListings.size();
mListings.clear();
// should be notifyItemRangeRemoved(0, size)
mAccountListingsAdapter.notifyItemRangeRemoved(0, size - 1);
其次,notifyDataSetChanged()
不受欢迎,因为它会触发所有可见视图的重新绑定和重新布局。在您的情况下,可见项目的数量为零,我不明白为什么notifyDataSetChanged()
会降低性能。如果要动画删除项目,请使用notifyItemRangeRemoved(0, size)
。否则,在这里使用notifyDataSetChanged()
就可以了。