- 前言
本文主要分成四部分。
页面局部刷新实现
最近接到一个需求,就是在我的应用页面,当监听到应用安装或者卸载时,不要重新刷新页面,只要更新图标,更新焦点即可。
因为在电视上开发应用,所以全部使用leanbak方式开发。
实现方式:updateDiff()方法中使用leanback的ArrayObjectAdapter的void setItems(final List itemList, final DiffCallback callback)方法局部刷新界面。
实现方法
/**
* 通过DiffCallback实现局部视图刷新
*/
protected void updateDiff(Block<DisplayItem> newAppData) {
try {
if (newAppData == null || newAppData.items == null) {
return;
}
ViewHolder rowVh = mHolder;
if (newAppData.items.size() > 0) {
ArrayObjectAdapter mArrayObjectAdapter = rowVh.mAdapter;
if (mArrayObjectAdapter != null) {
mArrayObjectAdapter.setItems(newAppData.items, new DiffCallback() {
@Override
public boolean areItemsTheSame(@NonNull Object oldData, @NonNull Object newData) {
...
}
@Override
public boolean areContentsTheSame(@NonNull Object oldData, @NonNull Object newData) {
...
}
@Override
public Object getChangePayload(@NonNull Object oldData, @NonNull Object newData){
...
}
});
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
DiffCallback类三个接口如下。如何使用?
先说结论
areItemsTheSame:判断item占位是否相同,一般根据item.id去判断。但内容可以不同(参考viewhold复用)
areContentsTheSame:areItemsTheSame返回True时,才会调用,返回内容是否相同。
getChangePayload:areItemsTheSame返回True,areContentsTheSame返回False才会回调,即item相同,content不同时才会回调,表示内容的差异,返回差异的数据diffData。没有差异返回super即可。