亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在回收站視圖中自動更新項目數據?

如何在回收站視圖中自動更新項目數據?

慕碼人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 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號