android – RecyclerView更改数据集

我想为我的RecyclerView实现搜索功能。在文本更改,我想更改与此小部件显示的数据。也许这个问题之前已经问过或很简单,但我不知道如何更改要显示的数据…

我的RecyclerView定义如下:

     // 1. get a reference to recyclerView
    mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView);

    // 2. set layoutManger
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    // 3. create an adapter
    mAdapter = new ItemsAdapter(itemsData);
    // 4. set adapter
    mRecyclerView.setAdapter(mAdapter);

我显示的数据是:

   ItemData itemsData[] = { new ItemData("Mary Richards"),
        new ItemData("Tom Brown"),
        new ItemData("Lucy London")          
};

所以当我想给适配器另一组数据,另一个数组(例如一个项目),我该怎么办?

如果你的适配器中有稳定的ID,你可以得到相当不错的结果(动画),如果你创建一个新的数组包含过滤的项目和调用

recyclerView.swapAdapter(newAdapter, false);

使用swapAdapter提示RecyclerView它可以重用视图持有者。 (vs在setAdapter中,它必须回收所有视图并重新创建,因为它不知道新适配器具有与旧适配器相同的ViewHolder设置)。

更好的方法是找到哪些项被删除,并调用notifyItemRemoved(index)。不要忘记实际删除项目。这将让RecyclerView运行预测动画。假设您有一个内部使用ArrayList的适配器,实现将如下所示:

// adapter code
final List<ItemData> mItems = new ArrayList(); //contains your items
public void filterOut(String filter) {
   final int size = mItems.size();
   for(int i = size - 1; i>= 0; i--) {
       if (mItems.get(i).test(filter) == false) {
           mItems.remove(i);
           notifyItemRemoved(i);
       }
   }
}

如果你可以批量处理notifyItemRemoved调用并使用notifyItemRangeRemoved,它将执行更好。它会看起来像:(未测试)

public void filterOut(String filter) {
   final int size = mItems.size();
   int batchCount = 0; // continuous # of items that are being removed
   for(int i = size - 1; i>= 0; i--) {
       if (mItems.get(i).test(filter) == false) {
           mItems.remove(i);
           batchCount ++;
       } else if (batchCount != 0) { // dispatch batch
           notifyItemRangeRemoved(i + 1, batchCount);
           batchCount = 0;
       }
   }
   // notify for remaining
   if (batchCount != 0) { // dispatch remaining
       notifyItemRangeRemoved(0, batchCount);
   }
}

您需要扩展此代码以添加先前已过滤但现在应该可见的项目(例如,用户删除过滤器查询),但我认为这应该给出基本的想法。

请记住,每个通知项调用会影响它后面的(这就是为什么我从列表遍历,以避免它)。遍历从结束也有助于ArrayList的remove方法的性能(更少的项目移动)。

例如,如果您从头开始遍历列表,并删除前两个项目。
你应该打电话

notifyItemRangeRemoved(0, 2); // 2 items starting from index 0

或者如果您逐个分派它们

notifyItemRemoved(0);
notifyItemRemoved(0);//because after the previous one is removed, this item is at position 0
http://stackoverflow.com/questions/26635841/recyclerview-change-data-set

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:android – RecyclerView更改数据集