2016年9月10日 星期六

Android 開發 (120) DiffUtil

前陣子android 發佈了新版的support lib 24.2.0,稍微看了一下,發現有個非常實用的新class

DiffUtil  先說說它的功用吧,還記得

mAdapter.notifyItemChanged();
mAdapter.notifyItemInserted();
mAdapter.notifyItemRemoved();



這些可以上我們展現出加入移除或ui更動時的動畫,但是...
利用這種做法,我常常會不小心遺漏掉某些item 忘了notifychange 造成crash,
現在google 出了一個新的lib DiffUtil 只要記住三個步驟即可

1. DiffUtil.calculateDiff
2. 更新adapter 的list
3. call dispatchUpdatesTo

你只需要定義新的list 並且實作某幾個function就可以達到這個功能



首先使用DiffUtil.calculateDiff (UserCallBack會定義哪些item是相同或不同)

接著只需要將新的list 塞到adapter裡面並且call dispatchUpdateTo就可以了


UserCallBack
areItemsTheSame,代表著是不是同一個東西,例如商品的id
areContentsTheSame,代表著內容是不是相同,例如這個商品是否有被選取,或者商品的數量是否有不同

接著只要套上剛剛的邏輯,就可以輕易的完成動畫效果
但是請大家注意一下官方文件  https://developer.android.com/reference/android/support/v7/util/DiffUtil.html

文件中有提到,如果在UI Thread 做大量的更新可能會造成等待過久,造成crash
建議在大量更新時使用background thread 做更新

不過小量的更新還是可以直接使用
最後還是要附上sample code