Android在RecyclerView中添加/替换项目
作者:互联网
我知道这个主题已经有很多线程,但到目前为止,没有一个给定的解决方案对我有用.我正在尝试添加或更新RecyclerView的项目.到目前为止,这是我的代码:
主要活动
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的正确方法
解决方法:
这应该工作:
private ArrayList<Item> mItems;
public void replaceItem(final Item newItem, final int position) {
mItems.set(position, newItem);
notifyItemChanged(position);
}
ArrayList.set()是替换项目的方法.
要添加项目,只需将它们附加到mItems然后再发送到notifyDatasetChanged().另一种方法是使用notifyItemRangeInserted().根据您添加新项目的位置/方式以及新项目的数量,可能值得.
标签:android-adapter,notifydatasetchanged,android,android-recyclerview 来源: https://codeday.me/bug/20190824/1707619.html