【问题标题】:Android add/replace Items within RecyclerViewAndroid 在 RecyclerView 中添加/替换项目
【发布时间】: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


    【解决方案1】:

    这应该可行:

    private ArrayList<Item> mItems;
    
    public void replaceItem(final Item newItem, final int position) {
        mItems.set(position, newItem);
        notifyItemChanged(position);
    }  
    

    ArrayList.set() 是替换物品的方式。

    要添加项目,只需将它们附加到mItems,然后转到notifyDatasetChanged()。另一种方法是使用notifyItemRangeInserted()。根据您在哪里/如何添加新项目以及它们的数量,这可能是值得的。

    【讨论】:

    • set 有效,但只能与 recyclerView.removeViewAt(position); 合作,这对于替换项目很好,但对我添加新项目没有帮助 -> mItems.add(item) + notifyDatasetChanged() / notifyItemRangeInserted(mItems.size() -1, 1) 可以什么都没有
    【解决方案2】:

    使用

     mItems.set(position, newItem);
    

    而不是

     mItems.add(position, newItem);
    

    因为.set 方法会将您的数据替换到特定位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多