從早期的listview到現(xiàn)在的recyclerview,不可避免的都是,遇到數(shù)據(jù)變化的時候,刷新界面,listview是最笨的,只能調(diào)用 notifydatasetchange來全局刷新,如果單個item變化,卻要我整個頁面刷新,太糟蹋性能了。
于是recyclerview橫空出世,推出了貼心的notidyItemchange跟notifyitemrangeChange,瞬間讓我喜愛上了,從此對recyclerview愛不釋手。
不過,notidyItemchange還不是極限,比如我的單個item里面,有圖片(從網(wǎng)絡(luò)獲?。?,有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對應(yīng)的viewholder,根據(jù)viewholder,只刷新我們對應(yīng)的控件,是不是很優(yōu)雅,極致的item刷新優(yōu)化。
該刷新方法在項目中親測,效率提升非常明顯,暫時沒發(fā)現(xiàn)有什么bug
有人可能會問,如果viewholder為空,該怎么辦?什么都不用辦,如果viewholder為空的話,說明該item不在屏幕顯示中,等滑動到顯示狀態(tài)的時候,recyclerview會自動調(diào)用onbindviewholder來刷新該item,你的item自然是最新的狀態(tài)了。