從早期的listview到現(xiàn)在的recyclerview,不可避免的都是湾蔓,遇到數(shù)據(jù)變化的時候,刷新界面砌梆,listview是最笨的默责,只能調(diào)用 notifydatasetchange
來全局刷新,如果單個item變化咸包,卻要我整個頁面刷新桃序,太糟蹋性能了。
于是recyclerview橫空出世烂瘫,推出了貼心的notidyItemchange
跟notifyitemrangeChange
媒熊,瞬間讓我喜愛上了,從此對recyclerview愛不釋手坟比。
不過芦鳍,notidyItemchange
還不是極限,比如我的單個item里面葛账,有圖片(從網(wǎng)絡獲饶啤),有toggleButton控件籍琳,當toggleButton狀態(tài)變化的時候菲宴,調(diào)用notidyItemchange
,那圖片資源也會跟著刷新趋急,有沒有辦法只刷新togglebutton控件呢喝峦?
答案就在這里:
RecyclerView.ViewHolder viewHolder = mRecyclerView.findViewHolderForAdapterPosition(i);
if (viewHolder != null && viewHolder instanceof ItemHolder) {
ItemHolder itemHolder = (ItemHolder) itemHolder
itemHolder.mButton.togglestate();
}
}
我們根據(jù)item的位置,獲取到這個item對應的viewholder呜达,根據(jù)viewholder谣蠢,只刷新我們對應的控件,是不是很優(yōu)雅,極致的item刷新優(yōu)化眉踱。
該刷新方法在項目中親測勋颖,效率提升非常明顯,暫時沒發(fā)現(xiàn)有什么bug
有人可能會問勋锤,如果viewholder為空饭玲,該怎么辦?什么都不用辦叁执,如果viewholder為空的話茄厘,說明該item不在屏幕顯示中,等滑動到顯示狀態(tài)的時候谈宛,recyclerview會自動調(diào)用onbindviewholder
來刷新該item次哈,你的item自然是最新的狀態(tài)了。