4 回答
TA贡献1804条经验 获得超2个赞
假设您的适配器有一个私有字段mItems
和一个如下所示的公共方法
public void setItems(List<YourClass> items){ mItems= items; notifyDataSetChanged(); }
调用此方法将刷新您的回收站视图。或者,您可以像这样简单地通知您的适配器:
yourAdapterInstance.notifyDataSetChanged();
TA贡献1884条经验 获得超4个赞
DiffCallback 的实现工作不正常:
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return newList.get(newItemPosition).getMacdev()==oldList.get(oldItemPosition).getMacdev() ;
}
使用 equals 方法而不是 '=='
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return newList.get(newItemPosition).getMacdev().equals(oldList.get(oldItemPosition).getMacdev()) ;
}
此外, this.notifyItemChanged(position);从方法中删除public void onBindViewHolder(CryptoViewHolder holder, int position, List<Object> payloads) {
还需要在发送更新之前更新列表。
public void setData(ArrayList<RepeaterModel> newData) {
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new
MyDiffUtilCallBack(newData, data));
data.clear();
this.data.addAll(newData);
diffResult.dispatchUpdatesTo(this);
}
PS:代码可能无法正常工作,将颜色更改为绿色可能会影响回收的“未更新”项目。最好通过将编辑/更新的信息添加到模型来更改 RepeaterModel。
TA贡献2012条经验 获得超12个赞
您应该只设置adapter
ie一次。并且在您要更改用于刷新列表的recylerview.setAdapter(adapter)
数据的任何其他地方。它只会刷新更改而不是整个列表。Arraylist
adapter.notifyDatasetChanged()
TA贡献1810条经验 获得超5个赞
您应该将 notifyItemChanged() 与自定义对象一起使用,而不是 notifyDatasetChanged。
创建数据类说 UpdateRecord 有 2 个成员
data class UpdateRecord(val _name : String? , val _rssi :String?)
当 rssi 变化时,调用 Adapter 的
notifyItemChange(position, UpdateRecord(null, newRssi))
您将收到 onBindViewHolder(position, payload) 调用,payload 中的第一个对象是 UpdateRecord 对象。检查并做
val updateRecord = payload[0] as UpdateRecord
if (updateRecord._name != null) {
// update name text view
}
if (updateRecord._rssi != null) {
// update rssi text view
}
这就是RecyclerView中的部分更新机制,只更新发生变化的部分。
添加回答
举报