Android 使用DiffUtil刷新Recyclerview

說(shuō)明

DiffUtil是recycleview-v7包下新增的一個(gè)工具類,配合recyclerview使用可以是實(shí)現(xiàn)高效地刷新。當(dāng)然,除了效率之外,還有刷新動(dòng)畫,使整個(gè)刷新交互更加流暢。

效果圖

diffutil效果

普通刷新效果

如何使用

1,項(xiàng)目里面依賴相應(yīng)的jar包

  compile'com.android.support:design:26.1.0'

2, 在原來(lái)的刷新邏輯里將

   adapter.notifyDataSetChanged();
   替換為
   DiffUtil.calculateDiff(new DiffUtilCallBack(newData,oldData), true).dispatchUpdatesTo(adapter);

這邊重點(diǎn)說(shuō)一下DiffUtilCallBack 這個(gè)類

public class DiffUtilCallBack extends DiffUtil.Callback {
  private List<String> newlist;
  private List<String> oldlist;

  public DiffUtilCallBack(List<String> newlist, List<String> oldlist) {
    this.newlist = newlist;
    this.oldlist = oldlist;
  }

  @Override
  public int getOldListSize() {
    return oldlist.size();
  }

  @Override
  public int getNewListSize() {
    return newlist.size();
  }

  @Override
  public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
    return newlist.get(newItemPosition).equals(oldlist.get(oldItemPosition));//判斷是否是同一個(gè)item,可以在這里處理   判斷是否是相同item的邏輯,比如id之類的
  }

  @Override
  public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
    return newlist.get(newItemPosition).equals(oldlist.get(oldItemPosition));//判斷數(shù)據(jù)是否發(fā)生改變,這個(gè)  方法會(huì)在上面的方法返回true時(shí)調(diào)用,  因?yàn)殡m然item是同一個(gè),但有可能item的數(shù)據(jù)發(fā)生了改變
  }
}

另外為了考慮擴(kuò)展性,可以將DiffUtilCallBack 進(jìn)一步處理

public class DiffUtilCallBack<T extends YourBaseBean> extends DiffUtil.Callback {
  private List<T> newlist;
  private List<T> oldlist;
  public DiffUtilCallBack(List<T> newlist, List<T> oldlist) {
    this.newlist = newlist;
    this.oldlist = oldlist;
  }
  @Override
  public int getOldListSize() {
    return oldlist.size();
  }
  @Override
  public int getNewListSize() {
      return newlist.size();
  }

  @Override
  public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
     //todo   根據(jù)YourBaseBean的 條件來(lái)判斷
  }

  @Override
  public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
   //todo   根據(jù)YourBaseBean的 條件來(lái)判斷
  }
}

注意點(diǎn)

areItemsTheSame
areContentsTheSame
這兩個(gè)重寫方法的判斷邏輯要寫好,否則,可能會(huì)和你預(yù)期的刷新效果不一樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容