package com.example.a16040657.adaptertest;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by 16040657 on 2018/4/2. */public abstract class SmartRecylerItem extends RecyclerView.ViewHolder { private T data; /** * 这个构造函数其实并不会直接调用 * 是为了给另外一个真正使用的构造函数使用 * * @param itemView */ public SmartRecylerItem(View itemView) { super(itemView); } /** * 真正使用的构造函数是这个 * * @param itemLayoutId * @param parent */ public SmartRecylerItem(int itemLayoutId, ViewGroup parent) { this(LayoutInflater.from(parent.getContext()).inflate(itemLayoutId, parent, false)); } /** * 这个方法不多说了 * @param id * @return */ public View findViewById(int id) { return itemView.findViewById(id); } /** * adapter代码里 会直接调用这个bind方法 * * @param position * @param data */ public void bindData(int position, T data) { this.data = data; onSetData(position, data); } /** * 设置数据 这个方法交给子类来实现 * * @param position 位置 * @param data 数据 */ protected abstract void onSetData(int position, T data); /** * 这个方法就是在adapter里面的oncreateviewholder里面调用,交给子类实现。 * 只执行一次,通常我们可以在这里面设置一下view的尺寸,以及复杂嵌套布局的一些属性等等 * * @param context */ protected abstract void configView(Context context); /** * 这个方法我们用来重写findviewbyid 之类的方法 */ protected abstract void findViews();}复制代码
然后我们对adapter做一次扩充:
package com.example.a16040657.adaptertest;import android.support.v7.widget.RecyclerView;import android.util.SparseArray;import android.view.ViewGroup;import java.util.ArrayList;import java.util.List;/** * Created by 16040657 on 2018/4/2. */public class SmartRecylerAdapter extends RecyclerView.Adapter { public SmartRecylerAdapter(List
最后看下我们的中间件代码:
package com.example.a16040657.adaptertest;import android.view.ViewGroup;/** * 中间件,这个类的主要作用就是桥接adapter和viewholder使用 */public abstract class SmartRecylerItemMiddleware { /** * 这个值就是在多布局的情况下,返回的itemType的值,我们在中间件里储存一下这个值 * 方便使用 */ private int itemType; /** * 匹配数据 * * @param data 待匹配的数据,通常是使用instanceof关键字匹配类型 * @return 如果返回true,Adapter将会使用此ItemFactory来处理当前这条数据 */ public abstract boolean isTarget(Object data); /** * 创建Item */ public abstract T createSmartItem(ViewGroup parent); public int getItemType() { return itemType; } public void setItemType(int itemType) { this.itemType = itemType; } protected T dispatchCreatesSmartItem(ViewGroup parent) { T item = createSmartItem(parent); item.findViews(); item.configView(parent.getContext()); return item; }}复制代码