【发布时间】:2015-10-29 10:36:49
【问题描述】:
我知道已经有很多关于这个主题的主题,但到目前为止,没有一个给定的解决方案对我有用。我正在尝试添加或更新 RecyclerView 的项目。到目前为止,这是我的代码:
MainActivity
private MyListItemAdapter mAdapter;
private RecyclerView recyclerView;
// called on activity create
private void init() {
// initialize activity, load items, etc ...
mAdapter = new MyListItemAdapter(this, items);
recyclerView.setAdapter(mAdapter);
}
// called when I want to replace an item
private void updateItem(final Item newItem, final int pos) {
mAdapter.replaceItem(newItem, pos);
}
MyListItemAdapter
public class MyListItemAdapter extends RecyclerView.Adapter<MyListItemAdapter.MyListItemViewHolder> {
private List<Item> mItems;
public void replaceItem(final Item newItem, final int pos) {
mItems.remove(position);
mItems.add(position, newItem);
notifyItemChanged(position);
notifyDataSetChanged();
}
}
我也尝试从MainActivity 进行更改,但在每种情况下,我都尝试过我的列表没有更新。它起作用的唯一方法是当我将适配器重置为 recyclerView 时:
mAdapter.notifyDataSetChanged();
recyclerView.setAdapter(mAdapter);
这显然是个坏主意。 (当我在列表中使用延迟加载时,除了不好的副作用之外,它甚至都不起作用)。
所以我的问题是,我怎样才能让notifyDataSetChanged() 正常工作?
编辑
我找到了更换物品的解决方案。在mAdapter.replaceItem(newItem, pos); 之后我不得不打电话给recyclerView.removeViewAt(position);
这适用于替换项目,但当我想将项目(例如延迟加载)添加到我的列表时并不能解决我的问题
edit2
我找到了添加项目的有效解决方案
适配器:
public void addItem(final Item newItem) {
mItems.add(newItem);
notifyDataSetChanged();
}
活动:
private void addItem(final Item newItem) {
mAdapter.addItem(newItem);
recyclerView.removeViewAt(0); // without this line nothing happens
}
由于某种原因,这可行(另外:它不会删除位置 0 的视图),但我确信这不是将项目添加到 recyclerView 的正确方法
【问题讨论】:
标签: android android-recyclerview android-adapter notifydatasetchanged