RecyclerView的万能适配器
首先写一个万能适配器的Holder的对象继承RecyclerView.ViewHolder 里面重写BaseHolder方法
然后定义一个getView方法从容器中取控件的id,这里要说的是 我们可以定义一个SparseArray的集合,设置View的泛型
从集合中根据id取控件
然后写一个BaseAdapter的适配器,继承RecyclerView.Adapter,泛型写成BaseHolder,重写三个方法,第一个方法是创建布局容器,第二个方法把行布局和控件绑定,第三个方法是返回长度,然后
定义上下文对象和数据源集合,构造,写一个getLayoutId的int型抽象方法查找行布局和一个绑定的抽象方法把控件绑定到布局上,然后生成子类,继承抽象方法在子类里定义不同的多布局适配
代码:
BaseHolder类
/**
* 万能适配器的Holder 对象
*/
public class BaseHolder extends RecyclerView.ViewHolder {
SparseArray<View> array=new SparseArray<>();
public BaseHolder(@NonNull View itemView) {
super(itemView);
}
/**
* 从容器中取控件
* @return
*/
public View getView(int id){
View v=null;
v=array.get(id);//从集合中根据id取控件
if(v==null){
v=itemView.findViewById(id);
array.put(id,v);
}
return v;
}
}
BaseAdapter适配器
public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseHolder> {
Context context;
ArrayList<T> data;//数据源
public BaseAdapter(Context context, ArrayList<T> data) {
this.context = context;
this.data = data;
}
public abstract int getLayoutID();
@NonNull
@Override
public BaseHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View inflate = LayoutInflater.from(context).inflate(getLayoutID(), null);
return new BaseHolder(inflate);
}
@Override
public void onBindViewHolder(@NonNull BaseHolder baseHolder, int i) {
binding(baseHolder,i);
}
public abstract void binding(BaseHolder baseHolder,int i);//绑定
@Override
public int getItemCount() {
return data.size();
}
}
子适配器
public class FirstAdapter extends BaseAdapter<Integer> {
Context context;
ArrayList<Integer> strings1=new ArrayList<>();
ArrayList<String> strings2=new ArrayList<>();
public FirstAdapter(Context context1, ArrayList<Integer> strings1,ArrayList<String> strings2) {
super(context1, strings1);
this.context = context1;
this.strings1 = strings1;
this.strings2 = strings2;
}
@Override
public int getLayoutID() {
return R.layout.text;
}
@Override
public void binding(BaseHolder baseHolder, int i) {
//找到控件 赋值
ImageView imageView = (ImageView) baseHolder.getView(R.id.image);
imageView.setImageResource(strings1.get(i));
TextView textView= (TextView) baseHolder.getView(R.id.text);
textView.setText(strings2.get(i));
}
}
MainActivity类
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private ArrayList<Integer> list = new ArrayList<>();
private ArrayList<String> list2 = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
recyclerView = findViewById(R.id.recyclerView);
// recyclerView.setLayoutManager(new LinearLayoutManager(this));
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
list.add(R.mipmap.aa);
list.add(R.mipmap.bb);
list.add(R.mipmap.cc);
list.add(R.mipmap.dd);
list.add(R.mipmap.ee);
list.add(R.mipmap.ff);
list.add(R.mipmap.gg);
list.add(R.mipmap.hh);
list.add(R.mipmap.ii);
list.add(R.mipmap.jj);
list.add(R.mipmap.kk);
list2.add("迟暮");
list2.add("暮衍");
list2.add("笑辞");
list2.add("秋意");
list2.add("爱殇");
list2.add("苏墨");
list2.add("陈秋");
list2.add("无羁");
list2.add("忘羡");
list2.add("离合");
list2.add("东苑");
FirstAdapter firstAdapter=new FirstAdapter(Main2Activity.this,list,list2);
recyclerView.setAdapter(firstAdapter);
// new BaseAdapter<>();
}
}