国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

淺談Android為RecyclerView增加監聽以及數據混亂的小坑

2019-12-12 03:01:30
字體:
來源:轉載
供稿:網友

為 RecyclerView增加監聽

1、在實現好的MyAdapter中寫內部接口:

public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {  this.onItemLongClickListener = onItemLongClickListener;}public void setOnItemClickListener(OnItemClickListener onItemClickListener) {  this.onItemClickListener = onItemClickListener;}<!--點擊監聽-->public interface OnItemClickListener {  void onItemClick(View view, int pos);}<!--長按監聽-->public interface OnItemLongClickListener {  void onItemLongClick(View view, int position);}

2、繼續在MyAdapter中增加以下代碼:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {private OnItemClickListener onItemClickListener;private OnItemLongClickListener onItemLongClickListener;      ......@Overridepublic 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數據變化時,RecyclerView.Adapter提供幾個局部刷新數據視圖的方法:

//該方法用于當增加一個數據的時候,position表示新增數據顯示的位置final void notifyItemInserted(int position)//該方法用于刪除一個數據的時候,position表示數據刪除的位置final void notifyItemRemoved(int position)//該方法表示所在position對應的item位置不會改變,但是該item內容發生變化final void notifyItemChanged(int position)//當然也還有老方法全部刷新,該方法一般用于:適配器之前裝載的數據大部分已經過時了,需要重新更新數據調用 //該方法的時候,recyclerView會重新計算子item及所有子item重新布局,簡單但是效率低并且不帶默認的動畫:final void notifyDataSetChanged()

出于效率考慮,官方建議用更加精確的方法(比如上面三個方法)來取代這個方法:

①.在RecyclerView.ViewHolder中說提及position(下標)時,有兩種情況:

i.由ViewHolder的 getLayoutPosition() 方法返回的,是視圖中 itemView 的下標

i.由ViewHolder的 getAdapterPosition() 方法返回的,是Adapter數據集(如ArrayList) data元素 的下標.

正常時,第幾個itemView上顯示地接個data的內容,兩者一一對應。

②. 但是在使用局部刷新的幾個方法時要注意,我們知道,一個數據集比如ArrayList,移除某個元素時,它后面的元素會向前填充,所以后面每個元素的下標都會減一;

③. 然而對于 getLayoutPosition() 來講,當我們用 notifyItemInserted 方法移除掉一個itemView時,視圖上看后面的itemView會擠上去,但是它們的下標是沒有變的。比如十個itemView(下標0到9)我用 notifyItemInserted 方法移除了第三個, 那么視圖中剩下的itemView的下標就是(0,1和3到9), 這時候再去對數據集調用remove(9)的話勢必會拋出數組越界異常;

④. 因此在每次刷新后,要使用 notifyItemRangeChanged(int positionStart,int itemCount) 調整itemView的下標,使其和數據集的下標始終是一一對應。其中 positionStart 是第一個改變的itemView下標,itemCount指它后面下標也需要改變的itemView個數

以上是RecyclerView的初級具體使用方法。

這篇淺談Android為RecyclerView增加監聽以及數據混亂的小坑就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 霍林郭勒市| 崇州市| 广饶县| 郯城县| 元江| 自治县| 雅安市| 海伦市| 巴林右旗| 寿阳县| 西安市| 溆浦县| 涟源市| 乐昌市| 金坛市| 辉南县| 昆山市| 牟定县| 吉木乃县| 探索| 海口市| 漳浦县| 平潭县| 万载县| 常熟市| 汶上县| 井冈山市| 津市市| 扶风县| 义乌市| 盐城市| 鲁山县| 应用必备| 古交市| 革吉县| 云浮市| 彰化市| 博兴县| 陆丰市| 施秉县| 兰考县|