欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Android為RecyclerView增加監(jiān)聽(tīng)以及數(shù)據(jù)混亂的小坑

 更新時(shí)間:2017年04月22日 11:22:20   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇淺談Android為RecyclerView增加監(jiān)聽(tīng)以及數(shù)據(jù)混亂的小坑。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

為 RecyclerView增加監(jiān)聽(tīng)

1、在實(shí)現(xiàn)好的MyAdapter中寫(xiě)內(nèi)部接口:

public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
  this.onItemLongClickListener = onItemLongClickListener;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
  this.onItemClickListener = onItemClickListener;
}
<!--點(diǎn)擊監(jiān)聽(tīng)-->
public interface OnItemClickListener {
  void onItemClick(View view, int pos);
}

<!--長(zhǎng)按監(jiān)聽(tīng)-->
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;
    }
  });

}
}

以上代碼是接口一般的寫(xiě)法,沒(méi)什么難度,需要注意的是幾個(gè)局部刷新的方法。

3、為了將性能提升至極致,RecyclerView的視圖中某個(gè)item數(shù)據(jù)變化時(shí),RecyclerView.Adapter提供幾個(gè)局部刷新數(shù)據(jù)視圖的方法:

//該方法用于當(dāng)增加一個(gè)數(shù)據(jù)的時(shí)候,position表示新增數(shù)據(jù)顯示的位置
final void notifyItemInserted(int position)

//該方法用于刪除一個(gè)數(shù)據(jù)的時(shí)候,position表示數(shù)據(jù)刪除的位置
final void notifyItemRemoved(int position)

//該方法表示所在position對(duì)應(yīng)的item位置不會(huì)改變,但是該item內(nèi)容發(fā)生變化
final void notifyItemChanged(int position)

//當(dāng)然也還有老方法全部刷新,該方法一般用于:適配器之前裝載的數(shù)據(jù)大部分已經(jīng)過(guò)時(shí)了,需要重新更新數(shù)據(jù)調(diào)用 
//該方法的時(shí)候,recyclerView會(huì)重新計(jì)算子item及所有子item重新布局,簡(jiǎn)單但是效率低并且不帶默認(rèn)的動(dòng)畫(huà):

final void notifyDataSetChanged()

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

①.在RecyclerView.ViewHolder中說(shuō)提及position(下標(biāo))時(shí),有兩種情況:

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

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

正常時(shí),第幾個(gè)itemView上顯示地接個(gè)data的內(nèi)容,兩者一一對(duì)應(yīng)。

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

③. 然而對(duì)于 getLayoutPosition() 來(lái)講,當(dāng)我們用 notifyItemInserted 方法移除掉一個(gè)itemView時(shí),視圖上看后面的itemView會(huì)擠上去,但是它們的下標(biāo)是沒(méi)有變的。比如十個(gè)itemView(下標(biāo)0到9)我用 notifyItemInserted 方法移除了第三個(gè), 那么視圖中剩下的itemView的下標(biāo)就是(0,1和3到9), 這時(shí)候再去對(duì)數(shù)據(jù)集調(diào)用remove(9)的話勢(shì)必會(huì)拋出數(shù)組越界異常;

④. 因此在每次刷新后,要使用 notifyItemRangeChanged(int positionStart,int itemCount) 調(diào)整itemView的下標(biāo),使其和數(shù)據(jù)集的下標(biāo)始終是一一對(duì)應(yīng)。其中 positionStart 是第一個(gè)改變的itemView下標(biāo),itemCount指它后面下標(biāo)也需要改變的itemView個(gè)數(shù)

以上是RecyclerView的初級(jí)具體使用方法。

這篇淺談Android為RecyclerView增加監(jiān)聽(tīng)以及數(shù)據(jù)混亂的小坑就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 消息機(jī)制以及handler的內(nèi)存泄露

    Android 消息機(jī)制以及handler的內(nèi)存泄露

    這篇文章主要介紹了Android 消息機(jī)制以及handler的內(nèi)存泄露的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Android使用xml自定義圖片實(shí)例詳解

    Android使用xml自定義圖片實(shí)例詳解

    這篇文章主要介紹了 Android使用xml自定義圖片實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Android開(kāi)發(fā)之Activity管理工具類完整示例

    Android開(kāi)發(fā)之Activity管理工具類完整示例

    這篇文章主要介紹了Android開(kāi)發(fā)之Activity管理工具類,集合完整實(shí)例形式分析了Android操作Activity創(chuàng)建、添加、獲取、移除等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Android 二維碼掃描和生成二維碼功能

    Android 二維碼掃描和生成二維碼功能

    二維碼,我們也稱作QRCode,QR表示quick response即快速響應(yīng),在很多App中我們都能見(jiàn)到二維碼的身影,最常見(jiàn)的莫過(guò)于微信了。下面通過(guò)本文給大家講解Android 二維碼掃描和生成二維碼功能,需要的朋友參考下吧
    2017-12-12
  • Android自定義控件之翻轉(zhuǎn)按鈕的示例代碼

    Android自定義控件之翻轉(zhuǎn)按鈕的示例代碼

    本篇文章主要介紹了Android自定義控件之翻轉(zhuǎn)按鈕的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Android三種菜單實(shí)例分析

    Android三種菜單實(shí)例分析

    這篇文章主要介紹了Android三種菜單,較為詳細(xì)的分析了Android菜單分類及相關(guān)使用技巧,需要的朋友可以參考下
    2015-05-05
  • Android如何判斷一個(gè)點(diǎn)在不在多邊形區(qū)域內(nèi)

    Android如何判斷一個(gè)點(diǎn)在不在多邊形區(qū)域內(nèi)

    這篇文章主要為大家詳細(xì)介紹了Android判斷一個(gè)點(diǎn)在不在多邊形區(qū)域內(nèi)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android四大組件之Activity深入解讀生命周期

    Android四大組件之Activity深入解讀生命周期

    雖然說(shuō)我們天天都在使用Activity,但是你真的對(duì)Activity的生命機(jī)制完全了解了嗎?Activity的生命周期方法只有七個(gè),但是其實(shí)那只是默認(rèn)的情況。也就是說(shuō)在其他情況下,Activity的生命周期可能不會(huì)是按照我們以前所知道的流程,這就要說(shuō)到Activity的啟動(dòng)模式
    2022-07-07
  • Android StickyListHeaders實(shí)現(xiàn)電話本列表效果

    Android StickyListHeaders實(shí)現(xiàn)電話本列表效果

    這篇文章主要為大家詳細(xì)介紹了Android StickyListHeaders實(shí)現(xiàn)電話本列表效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Android滾動(dòng)條廣告實(shí)現(xiàn)代碼示例

    Android滾動(dòng)條廣告實(shí)現(xiàn)代碼示例

    本篇文章主要介紹了Android滾動(dòng)條廣告實(shí)現(xiàn)代碼示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09

最新評(píng)論