8.使用BaseRecyclerViewAdapter來簡化使用

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

詳解RecyclerView系列文章目錄

概述

如果你經常使用RecyclerView,那么你會發現他的使用方法比ListView復雜多了,需要手動設置布局管理器,設置分割線,設置條目動畫,還得處理點擊事件,長按事件等。那么這節課就是要來解決這些問題,封裝一些常用的東西。

添加數據,ViewHolder泛型

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

}

可以看到我們給BaseRecyclerViewAdapter添加了兩個泛型,D用來標示數據的類型,也就是bindData這個方法中藥顯示的數據類型,添加他的目的是,我們還要在這個類添加getData這樣的方法,這樣在需要用數據的時候不需要將Object類型轉為自己的類型了,后面的V標示ViewHolder的類型,這樣就可以在onCreateViewHolder,onBindViewHolder拿到自己當時定義的類型,免去了強轉。

添加數據源容器

我們添加一個容器的好處是,好處就是不會空指針。同時可以在父類實現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;
}

添加了一些常用的方法。方便開發的的時候快速使用。

添加點擊事件

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

@Override
public void onBindViewHolder(final V holder, final int position) {
  //點擊事件
  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);
    }
  }
}

可以看到這次少了很多任務,這個Adapter類也就簡化了很多,從而提高開發效率。

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);

下一期講解如果實現類似ListView的EmptyView效果。并提供必要的封裝。

完整版代碼,已被不時之需。請查看原文有字數限制。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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