Android:需要更新从微调框中select的项目更新回收视图的build议

我是新来的回收视图。 我的要求如下: – 我必须调用一个Web服务,将提供两个数组。 一个与我需要显示在列表中的数据。 为此,我正在使用RecyclerView 。 另一个arrays是状态,我在微调中显示。 这个Web服务是分页的。 我已经添加了分页,它工作正常。 – 当用户从微调框中select一些其他元素时,我必须再次进行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 

但是,build议不要直接在回收视图适配器上调用notifyDataSetChanged(),而应该调用特定的notifyXXX方法,以避免性能和animation问题。

所以,我怀疑,如果我正确地通知旋转工具的onItemSelected()的回收视图适配器,或者应该改变它。

PS我试着在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 

我认为notifyItemRangeRemoved是在这里使用的正确的方法,但您传递给第二个参数的值是错误的。 根据文档,第二个参数是从数据集中删除的项目的数量,你正在传递的是最后一项删除的位置。

在这里输入图像说明

所以下面的代码应该可以正常工作

 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)

首先, 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() ,因为它触发所有可见视图的重新绑定和重新布局。 在你的情况下,可见项的数量是零,我不明白为什么notifyDataSetChanged()会降低性能。 如果您正在animation删除项目,请使用notifyItemRangeRemoved(0, size) 。 否则,在这里使用notifyDataSetChanged()了。