8.使用BaseRecyclerViewAdapter來簡(jiǎn)化使用

/**
 * 作者:Pich
 * 原文鏈接:http://me.woblog.cn/
 * QQ群:129961195
 * 微信公眾號(hào):woblog
 * Github:https://github.com/lifengsofts
 */

詳解RecyclerView系列文章目錄

概述

如果你經(jīng)常使用RecyclerView,那么你會(huì)發(fā)現(xiàn)他的使用方法比ListView復(fù)雜多了,需要手動(dòng)設(shè)置布局管理器,設(shè)置分割線,設(shè)置條目動(dòng)畫,還得處理點(diǎn)擊事件,長(zhǎng)按事件等。那么這節(jié)課就是要來解決這些問題,封裝一些常用的東西。

添加數(shù)據(jù),ViewHolder泛型

public abstract class BaseRecyclerViewAdapter<D,V extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<V> {

}

可以看到我們給BaseRecyclerViewAdapter添加了兩個(gè)泛型,D用來標(biāo)示數(shù)據(jù)的類型,也就是bindData這個(gè)方法中藥顯示的數(shù)據(jù)類型,添加他的目的是,我們還要在這個(gè)類添加getData這樣的方法,這樣在需要用數(shù)據(jù)的時(shí)候不需要將Object類型轉(zhuǎn)為自己的類型了,后面的V標(biāo)示ViewHolder的類型,這樣就可以在onCreateViewHolder,onBindViewHolder拿到自己當(dāng)時(shí)定義的類型,免去了強(qiáng)轉(zhuǎn)。

添加數(shù)據(jù)源容器

我們添加一個(gè)容器的好處是,好處就是不會(huì)空指針。同時(shí)可以在父類實(shí)現(xiàn)getItemCount這樣的通用方法

private List<D> data = new ArrayList<>();

public void addData(List<D> data) {
  this.data.addAll(data);
  notifyItemRangeChanged(data.size() - 1, data.size());
}

public void setData(List<D> data) {
  this.data.clear();
  this.data.addAll(data);
  notifyDataSetChanged();
}

public D getData(int position) {
  return data.get(position);
}

@Override
public int getItemCount() {
  return data.size();
}

@Override
public long getItemId(int position) {
  return position;
}

添加了一些常用的方法。方便開發(fā)的的時(shí)候快速使用。

添加點(diǎn)擊事件

定義接口這里就不貼代碼了,直接上重要的代碼。

@Override
public void onBindViewHolder(final V holder, final int position) {
  //點(diǎn)擊事件
  if (onItemClickListener != null) {
    holder.itemView.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        if (onItemClickListener!=null) {
          onItemClickListener.onItemClick(holder,position);
        }
      }
    });
  }

  //常按事件
  if (onItemLongClickListener != null) {
    holder.itemView.setOnLongClickListener(new OnLongClickListener() {
      @Override
      public boolean onLongClick(View v) {
        return onItemLongClickListener.onItemLongClick(holder,position);
      }
    });
  }
}

添加所有的ViewHolder的父類

這樣做的目的是,所有的ViewHolder都繼承自我們的類,這樣一來我們就可以在父類使用像butterknife這樣的框架。

public abstract class  ViewHolder extends  RecyclerView.ViewHolder{

  public ViewHolder(View itemView) {
    super(itemView);
    //TODO 可以在這里加入butterknife這樣的框架。

  }

  @Nullable
  public final View findViewById(@IdRes int id) {
    return itemView.findViewById(id);
  }

}

使用自己的Adapter

public class UseCustomAdapter extends BaseRecyclerViewAdapter<String,UseCustomAdapter.ViewHolder> {

  public UseCustomAdapter(Context context) {
    super(context);
  }

  @Override
  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ViewHolder(getInflater().inflate(android.R.layout.simple_list_item_1,parent,false));
  }

  @Override
  public void onBindViewHolder(ViewHolder holder, int position) {
    super.onBindViewHolder(holder, position);
    holder.bindData(getData(position));
  }

  class ViewHolder extends BaseRecyclerViewAdapter.ViewHolder{

    private final TextView tv;

    public ViewHolder(View itemView) {
      super(itemView);
      tv = (TextView) itemView.findViewById(android.R.id.text1);
    }

    public void bindData(String data) {
      tv.setText(data);
    }
  }
}

可以看到這次少了很多任務(wù),這個(gè)Adapter類也就簡(jiǎn)化了很多,從而提高開發(fā)效率。

RecyclerView rv= (RecyclerView) findViewById(R.id.rv);
rv.setLayoutManager(new LinearLayoutManager(this));

UseCustomAdapter useCustomAdapter = new UseCustomAdapter(this);
rv.setAdapter(useCustomAdapter);

ArrayList<String> data = new ArrayList<>();
for (int i = 0; i < 50; i++) {
  data.add("Item " + i);
}

useCustomAdapter.setData(data);

下一期講解如果實(shí)現(xiàn)類似ListView的EmptyView效果。并提供必要的封裝。

完整版代碼,已被不時(shí)之需。請(qǐng)查看原文有字?jǐn)?shù)限制。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,848評(píng)論 25 709
  • 簡(jiǎn)介: 提供一個(gè)讓有限的窗口變成一個(gè)大數(shù)據(jù)集的靈活視圖。 術(shù)語表: Adapter:RecyclerView的子類...
    酷泡泡閱讀 5,358評(píng)論 0 16
  • 這篇文章分三個(gè)部分,簡(jiǎn)單跟大家講一下 RecyclerView 的常用方法與奇葩用法;工作原理與ListView比...
    LucasAdam閱讀 4,688評(píng)論 0 27
  • 01 九月的南方城市xy,溫度和夏日里沒有兩樣,小Q同學(xué)就是在這樣的天氣里入校的。 中考之前,小Q同學(xué)以為自己一定...
    暖心倩閱讀 594評(píng)論 0 1
  • 很久很久以前的廣東,有一天山洪爆發(fā)把橋給沖斷了,阿牛打柴回來,見有個(gè)姑娘過不了河,于是就牽來水牛送她過了河,但是他...
    億利新中農(nóng)閱讀 1,624評(píng)論 0 0

友情鏈接更多精彩內(nèi)容