其他分享
首页 > 其他分享> > Android在RecyclerView中添加/替换项目

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