首先实现大体思路是
1.搭建环境(添加依赖,添加布局控件,初始化控件)
* 2.初始化数据
* 3.创建适配器
* 4.设置适配器及布局管理对象
* <p>
* 什么是代码优化:1.可读性强 2.减少复杂逻辑 3.扩展性强
然后采用的是基类抽取的方式将
/**
* 子类共有,且实现相同的逻辑,抽取到基类中
* 子类共有,但实现不同的逻辑,以抽象方法在基类中使用
*/
因为这个接口返回数据生成的bean类中并没有返回type属性所以我是自己手动写的常量表示3种不同类别
//3个条目的父类 public abstract class FatherViewHolder extends RecyclerView.ViewHolder { public FatherViewHolder(@NonNull View itemView) { super(itemView); } public abstract void bindHolder(List<News.DataBean> list, int i); }
//3个子类条目
public class OneViewHolder extends FatherViewHolder { private final SimpleDraweeView img_item; private final TextView text_name_item; private final TextView text_title_item; public OneViewHolder(@NonNull View itemView) { super(itemView); img_item = itemView.findViewById(R.id.img_item); text_name_item = itemView.findViewById(R.id.text_name_item); text_title_item=itemView.findViewById(R.id.text_title_item); } @Override public void bindHolder(List<News.DataBean> list, int i) { text_name_item.setText(list.get(i).getAuthor_name()); text_title_item.setText(list.get(i).getTitle()); Uri parse = Uri.parse(list.get(i).getThumbnail_pic_s()); img_item.setImageURI(parse); } }
//在填充布局的时候要注意 mLayoutInflater=LayoutInflater.from(context); 如果没有写这个而是直接生成构造方法后期运行是会产生空指针异常 public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public static final int TYPE_ONE = 1; public static final int TYPE_TWO = 2; public static final int TYPE_THREE = 3; private ArrayList<News.DataBean> nlist; private Context context; private LayoutInflater mLayoutInflater; private OneViewHolder oneViewHolder; private TwoViewHolder twoViewHolder; private ThreeViewHolder threeViewHolder; public MyAdapter(ArrayList<News.DataBean> nlist, Context context) { this.nlist = nlist; mLayoutInflater=LayoutInflater.from(context); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType){ case TYPE_ONE: return new OneViewHolder(mLayoutInflater.inflate(R.layout.item, parent, false)); case TYPE_TWO: return new TwoViewHolder(mLayoutInflater.inflate(R.layout.item1, parent, false)); case TYPE_THREE: return new ThreeViewHolder(mLayoutInflater.inflate(R.layout.item2, parent, false)); } return null; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) { ((FatherViewHolder)viewHolder).bindHolder(nlist,i); } @Override public int getItemCount() { return nlist.size(); } @Override public int getItemViewType(int position) { if (!TextUtils.isEmpty(nlist.get(position).getThumbnail_pic_s03())){ return TYPE_THREE; }else if (!TextUtils.isEmpty(nlist.get(position).getThumbnail_pic_s02())){ return TYPE_TWO; }else { return TYPE_ONE; } } }