淺談Android為RecyclerView增加監(jiān)聽以及數(shù)據(jù)混亂的小坑
為 RecyclerView增加監(jiān)聽
1、在實(shí)現(xiàn)好的MyAdapter中寫內(nèi)部接口:
public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { this.onItemLongClickListener = onItemLongClickListener; } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } <!--點(diǎn)擊監(jiān)聽--> public interface OnItemClickListener { void onItemClick(View view, int pos); } <!--長按監(jiān)聽--> public interface OnItemLongClickListener { void onItemLongClick(View view, int position); }
2、繼續(xù)在MyAdapter中增加以下代碼:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private OnItemClickListener onItemClickListener; private OnItemLongClickListener onItemLongClickListener; ...... @Override public void onBindViewHolder(ViewHolder holder, int position) { final int pos = holder.getLayoutPosition(); holder.mTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (onItemClickListener != null) onItemClickListener.onItemClick(view, pos); } }); holder.mTextView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { if (onItemLongClickListener != null) { onItemLongClickListener.onItemLongClick(view, pos); } return true; } }); } }
以上代碼是接口一般的寫法,沒什么難度,需要注意的是幾個局部刷新的方法。
3、為了將性能提升至極致,RecyclerView的視圖中某個item數(shù)據(jù)變化時,RecyclerView.Adapter提供幾個局部刷新數(shù)據(jù)視圖的方法:
//該方法用于當(dāng)增加一個數(shù)據(jù)的時候,position表示新增數(shù)據(jù)顯示的位置 final void notifyItemInserted(int position) //該方法用于刪除一個數(shù)據(jù)的時候,position表示數(shù)據(jù)刪除的位置 final void notifyItemRemoved(int position) //該方法表示所在position對應(yīng)的item位置不會改變,但是該item內(nèi)容發(fā)生變化 final void notifyItemChanged(int position) //當(dāng)然也還有老方法全部刷新,該方法一般用于:適配器之前裝載的數(shù)據(jù)大部分已經(jīng)過時了,需要重新更新數(shù)據(jù)調(diào)用 //該方法的時候,recyclerView會重新計算子item及所有子item重新布局,簡單但是效率低并且不帶默認(rèn)的動畫: final void notifyDataSetChanged()
出于效率考慮,官方建議用更加精確的方法(比如上面三個方法)來取代這個方法:
①.在RecyclerView.ViewHolder中說提及position(下標(biāo))時,有兩種情況:
i.由ViewHolder的 getLayoutPosition() 方法返回的,是視圖中 itemView 的下標(biāo)
i.由ViewHolder的 getAdapterPosition() 方法返回的,是Adapter數(shù)據(jù)集(如ArrayList) data元素 的下標(biāo).
正常時,第幾個itemView上顯示地接個data的內(nèi)容,兩者一一對應(yīng)。
②. 但是在使用局部刷新的幾個方法時要注意,我們知道,一個數(shù)據(jù)集比如ArrayList,移除某個元素時,它后面的元素會向前填充,所以后面每個元素的下標(biāo)都會減一;
③. 然而對于 getLayoutPosition() 來講,當(dāng)我們用 notifyItemInserted 方法移除掉一個itemView時,視圖上看后面的itemView會擠上去,但是它們的下標(biāo)是沒有變的。比如十個itemView(下標(biāo)0到9)我用 notifyItemInserted 方法移除了第三個, 那么視圖中剩下的itemView的下標(biāo)就是(0,1和3到9), 這時候再去對數(shù)據(jù)集調(diào)用remove(9)的話勢必會拋出數(shù)組越界異常;
④. 因此在每次刷新后,要使用 notifyItemRangeChanged(int positionStart,int itemCount) 調(diào)整itemView的下標(biāo),使其和數(shù)據(jù)集的下標(biāo)始終是一一對應(yīng)。其中 positionStart 是第一個改變的itemView下標(biāo),itemCount指它后面下標(biāo)也需要改變的itemView個數(shù)
以上是RecyclerView的初級具體使用方法。
這篇淺談Android為RecyclerView增加監(jiān)聽以及數(shù)據(jù)混亂的小坑就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 適配Android 8.0版本更新安裝與通知欄的一些坑
- 淺談Android Studio3.0更新之路(遇坑必入)
- Android Studio升級到3.0后遇到的坑
- 淺析Android Studio 3.0 升級各種坑(推薦)
- 詳解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅
- 詳解關(guān)于Android Studio中安裝和gradle的一些坑
- Android 啟動activity的4種方式及打開其他應(yīng)用的activity的坑
- 深踩Android Studio 緩存的坑及解決方法
- Android WebView使用的技巧與一些坑
- Android 8.0中一些坑以及對應(yīng)的解決方法
相關(guān)文章
Android 消息機(jī)制以及handler的內(nèi)存泄露
這篇文章主要介紹了Android 消息機(jī)制以及handler的內(nèi)存泄露的相關(guān)資料,需要的朋友可以參考下2016-09-09Android開發(fā)之Activity管理工具類完整示例
這篇文章主要介紹了Android開發(fā)之Activity管理工具類,集合完整實(shí)例形式分析了Android操作Activity創(chuàng)建、添加、獲取、移除等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Android如何判斷一個點(diǎn)在不在多邊形區(qū)域內(nèi)
這篇文章主要為大家詳細(xì)介紹了Android判斷一個點(diǎn)在不在多邊形區(qū)域內(nèi)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05Android StickyListHeaders實(shí)現(xiàn)電話本列表效果
這篇文章主要為大家詳細(xì)介紹了Android StickyListHeaders實(shí)現(xiàn)電話本列表效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05