从早期的listview到现在的recyclerview,不可避免的都是,遇到数据变化的时候,刷新界面,listview是最笨的,只能调用 notifydatasetchange
来全局刷新,如果单个item变化,却要我整个页面刷新,太糟蹋性能了。
于是recyclerview横空出世,推出了贴心的notidyItemchange
跟notifyitemrangeChange
,瞬间让我喜爱上了,从此对recyclerview爱不释手。
不过,notidyItemchange
还不是极限,比如我的单个item里面,有图片(从网络获取),有toggleButton控件,当toggleButton状态变化的时候,调用notidyItemchange
,那图片资源也会跟着刷新,有没有办法只刷新togglebutton控件呢?
答案就在这里:
RecyclerView.ViewHolder viewHolder = mRecyclerView.findViewHolderForAdapterPosition(i);
if (viewHolder != null && viewHolder instanceof ItemHolder) {
ItemHolder itemHolder = (ItemHolder) itemHolder
itemHolder.mButton.togglestate();
}
}
我们根据item的位置,获取到这个item对应的viewholder,根据viewholder,只刷新我们对应的控件,是不是很优雅,极致的item刷新优化。
该刷新方法在项目中亲测,效率提升非常明显,暂时没发现有什么bug
有人可能会问,如果viewholder为空,该怎么办?什么都不用办,如果viewholder为空的话,说明该item不在屏幕显示中,等滑动到显示状态的时候,recyclerview会自动调用onbindviewholder
来刷新该item,你的item自然是最新的状态了。