一、引言
从事android开发已经快三年了,相信大家和我一样,写了无数列表View的适配器,不知大家是否厌倦了这些重复的流程和代码?反正我是早厌倦了。本篇旨在从一段司空见惯的RecyclerView适配器代码开始,一步一步抽取代码的重复部分,打造和ListView通用适配器类似的RecyclerView通用适配器,一来为大家提供RecyclerView通用适配器,提高开发效率,二来分享一种代码抽取的思路。记得之前带我的师傅曾说过:框架不是一下子空想出来的,是”演化”而来的,就像大家熟知的Imageloarder,1.0版本绝对不是现在这个样子。。。废话就扯到这里,下面先看看一段让人熟悉到吐的适配器代码:
package com.star.xadapter;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
/**
* Created by kakaxicm on 16/7/7.
*/
public class TestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private List<String> mData;
public TestAdapter(List<String> data){
mData = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new TestViewHolder(View.inflate(parent.getContext(),R.layout.item_test, null));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
TestViewHolder tHolder = (TestViewHolder) holder;
tHolder.tv.setText(mData.get(position));
}
@Override
public int getItemCount() {
return mData == null ? 0 : mData.size();
}
private class TestViewHolder extends RecyclerView.ViewHolder{
TextView tv;
public TestViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv);
}
}
}
当每个页面的RecyclerView的Model和View不同时,都得另写一个适配器,流程都是标准化的:
1.覆写getItemCount、onCreateViewHolder、onBindViewHolder方法,多类型支持还要覆写getItemViewType方法;
2.根据每个位置返回的itemview类型,构造不同的ViewHolder,ViewHolder和布局文件通过onBindViewHolder建立绑定关系。
既然流程是标准化的,那么这些公共的流程就可以抽取出来,具体的实现细节暴露给调用者实现。下面就来一步一步来“演化”代码,打造通用的适配器。
二、通用适配器初步演化
从第一节的分析,我们可以把公共的部分抽取出来,具体的细节通过接口暴露给调用者实现。那么公共部分有哪些呢?哪些细节是和业务相关的呢?
1.上面提到的四个方法规定了公共的流程,可以抽取出来;
2.数据层是一个列表,支持的Model类型由用户决定,所以可以做泛型支持;
3.View层即ViewHolder,也可以通过接口由用户构造。当然适配器在多type情况下支持不同的ViewHolder,也需要做泛型支持;
4.从以上3点的分析,那么对外暴露的接口就应该是这样:暴露两个个方法,一个方法绑定数据入参是model和viewholder,另外一个方法构造viewholder。接口代码如下:
/**
* 绑定数据的接口