前言
最近做項(xiàng)目,使用 RecycleView + SwipeRefreshLayout 刷新時(shí)野崇,列表總是閃爍称开。
1、為什么會(huì)閃爍乓梨?
閃爍是 notifyDataSetChange 造成的鳖轰。由于適配器不知道整個(gè)數(shù)據(jù)集中的哪些內(nèi)容已經(jīng)存在,在重新匹配 ViewHolder 時(shí)發(fā)生的扶镀。
當(dāng)然,遇到這個(gè)問(wèn)題時(shí)有去搜索一些答案蕴侣,看到的很多都是去禁止 RecycleView 的默認(rèn)動(dòng)畫,可惜這對(duì)我沒什么用臭觉。下面的方法是對(duì)我有用的昆雀。
2、設(shè)置 setHasStableIds
下面給大家介紹一個(gè)方法 setHasStableIds
/**
* Indicates whether each item in the data set can be represented with a unique identifier
* of type {@link java.lang.Long}.
*
* @param hasStableIds Whether items in data set have unique identifiers or not.
* @see #hasStableIds()
* @see #getItemId(int)
*/
public void setHasStableIds(boolean hasStableIds) {
if (hasObservers()) {
throw new IllegalStateException("Cannot change whether this adapter has "
+ "stable IDs while the adapter has registered observers.");
}
mHasStableIds = hasStableIds;
}
long 類型的標(biāo)識(shí)可以表示數(shù)據(jù)集中的每個(gè)項(xiàng)目胧谈。
DemoAdapter mAdapter=new DemoAdapter();
mAdapter.setHasStablesId(true);
設(shè)置了這個(gè)屬性后忆肾,我們必須給每個(gè) Item 設(shè)置唯一的 ID。
3菱肖、重寫 getItemId
在 Adapter 類中重寫該方法來(lái)給每個(gè) Item 一個(gè)唯一的ID客冈。
@Override
public long getItemId(int position){
return items.get(position).getId();
}
這樣寫完之后閃爍就不再發(fā)生了。
getId()
只是我的一個(gè)方法稳强,如果您沒有一個(gè)類似 id 的唯一值场仲,則可以使用字符串上的hashCode()
來(lái)獲取唯一值。結(jié)果也是一樣的退疫。