1. 問題背景
? ? ?在做項目的時候,RecyclerView需要使用局部刷新,使用 notifyItemChanged(position, payload) 實現局部刷新,但發現調用多次只執行了一次,第二個刷新不生效。
2. 錯誤示例(只處理 payloads.get(0))
@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List<Object> payloads) {Log.d(TAG, "onBindViewHolder() 執行局部刷新 position:" + position + " payloads==null:" + (payloads == null));if (payloads != null) {Log.d(TAG, "payloads大小:" + payloads.size());}Object payload = payloads.get(0); // 錯誤:只處理了一個 payloadif (payloads != null && !payloads.isEmpty()) {// 局部刷新操作}else{// 如果 payload 無效,或者是全量刷新,就執行完整綁定邏輯onBindViewHolder(holder, position);}
}
3.根本原因分析
? ? ? ?去百度查閱資料和咨詢AI,RecyclerView 內部會將短時間內同一個 item 的多次 notifyItemChanged(position, payload) 合并,組成一個 payload 列表。所以 payloads 是一個 list,不是單個對象。
????????當我發送多次notifyItemChanged(position, payload), 然后只執行一次。后面我打印方法參數List<Object> payloads日志才發現,payloads大小有很多個,所以需要循環使用才行。
4. 正確處理方式 —— 遍歷 payloads 列表
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List<Object> payloads) {Log.d(TAG, "onBindViewHolder() 執行局部刷新 position:" + position + " payloads==null:" + (payloads == null));if (payloads != null) {Log.d(TAG, "payloads大小:" + payloads.size());}// Object payload = payloads.get(0); // 錯誤:只處理了一個 payloadif (payloads != null && !payloads.isEmpty()) {// 局部刷新操作for (int i = 0 ; i <payloads.size();i++){if ("局部刷新UI字段".equals(payloads.get(i))) {// UI更新...}}}else{// 如果 payload 無效,或者是全量刷新,就執行完整綁定邏輯onBindViewHolder(holder, position);}
}