为了账号安全,请及时绑定邮箱和手机立即绑定

如何在回收站视图中自动更新项目数据?

如何在回收站视图中自动更新项目数据?

慕码人2483693 2023-03-31 10:07:01
假设其中有一个RecyclerView包含CardView,在每张卡片中,即项目中有两个TextView用于设备名称,另一个用于 rssi 级别,因此当用户刷新数据时,只有 rssi 会刷新而不是整个列表刷新.我已经获得了数据,RecyclerView但它是重复的而不是更新它。模型类:-import android.support.annotation.NonNull;public class RepeaterModel implements Comparable,Cloneable{    public String macdev;    public int rssi ;    public int imageid;    public RepeaterModel(String macdev, int rssi, int imageid) {        this.macdev = macdev;        this.rssi = rssi;        this.imageid = imageid;    }    public String getMacdev() {        return macdev;    }    public void setMacdev(String macdev) {        this.macdev = macdev;    }    public int getRssi() {        return rssi;    }    public void setRssi(int rssi) {        this.rssi = rssi;    }    public int getImageid() {        return imageid;    }    public void setImageid(int imageid) {        this.imageid = imageid;    }    @Override    public int compareTo(@NonNull Object o) {        RepeaterModel compare =(RepeaterModel)o;        if(compare.getMacdev().equals(this.macdev) && compare.getImageid()==this.imageid && compare.getRssi()==this.rssi)        {            return 0;        }        return 1;    }    @Override    public RepeaterModel clone()    {        RepeaterModel clone;        try {            clone = (RepeaterModel) super.clone();        } catch (CloneNotSupportedException e) {            throw new RuntimeException(e); //should not happen        }        return clone;    }}
查看完整描述

4 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

假设您的适配器有一个私有字段mItems和一个如下所示的公共方法

public void setItems(List<YourClass> items){
    mItems= items;
    notifyDataSetChanged();
}

调用此方法将刷新您的回收站视图。或者,您可以像这样简单地通知您的适配器:

yourAdapterInstance.notifyDataSetChanged();


查看完整回答
反对 回复 2023-03-31
?
慕村9548890

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。


查看完整回答
反对 回复 2023-03-31
?
繁花如伊

TA贡献2012条经验 获得超12个赞

您应该只设置adapterie一次。并且在您要更改用于刷新列表的recylerview.setAdapter(adapter)数据的任何其他地方。它只会刷新更改而不是整个列表。Arraylistadapter.notifyDatasetChanged()

查看完整回答
反对 回复 2023-03-31
?
森栏

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中的部分更新机制,只更新发生变化的部分。


查看完整回答
反对 回复 2023-03-31
  • 4 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信