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

假设其中有一个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;


    }

}


慕码人2483693
浏览 98回答 4
4回答

慕婉清6462132

假设您的适配器有一个私有字段mItems和一个如下所示的公共方法public&nbsp;void&nbsp;setItems(List<YourClass>&nbsp;items){ &nbsp;&nbsp;&nbsp;&nbsp;mItems=&nbsp;items; &nbsp;&nbsp;&nbsp;&nbsp;notifyDataSetChanged(); }调用此方法将刷新您的回收站视图。或者,您可以像这样简单地通知您的适配器:yourAdapterInstance.notifyDataSetChanged();

慕村9548890

DiffCallback 的实现工作不正常:@Overridepublic boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {&nbsp; &nbsp; return newList.get(newItemPosition).getMacdev()==oldList.get(oldItemPosition).getMacdev() ;}使用 equals 方法而不是 '=='&nbsp; &nbsp; @Override&nbsp; &nbsp; public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {&nbsp; &nbsp; &nbsp; &nbsp; return newList.get(newItemPosition).getMacdev().equals(oldList.get(oldItemPosition).getMacdev()) ;&nbsp; &nbsp; }此外, this.notifyItemChanged(position);从方法中删除public void onBindViewHolder(CryptoViewHolder holder, int position, List<Object> payloads) {还需要在发送更新之前更新列表。public void setData(ArrayList<RepeaterModel> newData) {&nbsp; &nbsp; DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new&nbsp;&nbsp; &nbsp; MyDiffUtilCallBack(newData, data));&nbsp; &nbsp; data.clear();&nbsp; &nbsp; this.data.addAll(newData);&nbsp; &nbsp; diffResult.dispatchUpdatesTo(this);}PS:代码可能无法正常工作,将颜色更改为绿色可能会影响回收的“未更新”项目。最好通过将编辑/更新的信息添加到模型来更改 RepeaterModel。

繁花如伊

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

森栏

您应该将 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 UpdateRecordif (updateRecord._name != null) {&nbsp; // update name text view}if (updateRecord._rssi != null) {&nbsp; // update rssi text view}这就是RecyclerView中的部分更新机制,只更新发生变化的部分。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java