封装RecyclerView的Adapter

mac2024-03-11  31

ViewHolder

public class ViewHolder extends RecyclerView.ViewHolder { private SparseArray<View> mViews;//存放item中的控件 private View mContentView; public int mLayoutId; public ViewHolder(@NonNull View itemView,int layoutId) { super(itemView); mContentView = itemView; mLayoutId = layoutId; mViews = new SparseArray<>(); } public static ViewHolder get(Context context, ViewGroup parent, int layoutId){ View itemView = LayoutInflater.from(context).inflate(layoutId,parent,false); ViewHolder holder = new ViewHolder(itemView,layoutId); return holder; } public <T extends View> T getView(int viewId){ View view = mViews.get(viewId); if(view == null){ view = mContentView.findViewById(viewId); mViews.put(viewId,view); } return (T) view; } public void setText(int viewId,String text){ TextView textView = getView(viewId); textView.setText(text); } public ViewHolder setImageResource(int viewId,int resId){ ImageView view = getView(viewId); view.setImageResource(resId); return this; } public ViewHolder setOnClickListener(int viewId,View.OnClickListener listener){ View view = getView(viewId); view.setOnClickListener(listener); return this; } public ViewHolder setOnItemClickListener(View.OnClickListener listener){ mContentView.setOnClickListener(listener); return this; } }

BaseRecyclerAdapter

public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<ViewHolder> { protected Context mContext; protected int mLayoutId; protected List<T> mDatas; //给继承他的子类调用 public BaseRecyclerAdapter(Context context,List<T> datas){ mContext = context; mDatas = datas; } //单个itemViewType public BaseRecyclerAdapter(Context context,int layoutId,List<T> datas){ mContext = context; mLayoutId = layoutId; mDatas = datas; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { ViewHolder viewHolder = ViewHolder.get(mContext,parent,mLayoutId); return viewHolder; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { convert(holder,mDatas.get(position)); } @Override public int getItemCount() { return mDatas.size(); } public abstract void convert(ViewHolder holder,T t); }

MultiItemBaseRecyclerAdapter(多种itemViewType)

public abstract class MultiItemBaseRecyclerAdapter<T> extends BaseRecyclerAdapter<T>{ protected MultiItemTypeSupport<T> mMultiItemTypeSupport; public MultiItemBaseRecyclerAdapter(Context context, List<T> datas,MultiItemTypeSupport multiItemTypeSupport) { super(context, datas); mMultiItemTypeSupport = multiItemTypeSupport; } @Override public int getItemViewType(int position) { return mMultiItemTypeSupport.getItemViewType(position,mDatas.get(position)); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { int layoutId = mMultiItemTypeSupport.getLayoutId(viewType); ViewHolder holder = ViewHolder.get(mContext,parent,layoutId); return holder; } interface MultiItemTypeSupport<T>{ int getLayoutId(int itemType);//给不同的itemViewType类型设置不同的布局id int getItemViewType(int position,T t);//根据集合判断,给不同的itemViewType返回不同的类型 } }

使用

public class MainActivity extends AppCompatActivity { List<String> list = new ArrayList<>(); List<String> list_double = new ArrayList<>(); BaseRecyclerAdapter<String> adapter; MultiItemBaseRecyclerAdapter<String> adapter_double; @SuppressLint("WrongConstant") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = findViewById(R.id.recyclerView); RecyclerView recyclerView_double = findViewById(R.id.recyclerView_double); //单独的列表 LinearLayoutManager layoutManager= new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); for(int i = 0;i<30;i++){ list.add("测试文字"+i); } adapter = new BaseRecyclerAdapter<String>(this,R.layout.item_left,list) { @Override public void convert(ViewHolder holder, String s) { holder.setText(R.id.text,s); } }; recyclerView.setAdapter(adapter); //多个ItemViewType LinearLayoutManager layoutManager1= new LinearLayoutManager(this); layoutManager1.setOrientation(LinearLayoutManager.VERTICAL); recyclerView_double.setLayoutManager(layoutManager1); addList(); adapter_double = new MultiItemBaseRecyclerAdapter<String>(this,list_double,multiItemTypeSupport) { @Override public void convert(ViewHolder holder, String s) { holder.setText(R.id.text,s); } }; recyclerView_double.setAdapter(adapter_double); } private void addList(){ String[] strings = new String[]{"在么","在","吃过饭了么","没","你在干嘛","看电视","看什么电视","海绵宝宝","海绵宝宝","好看么","不好看"}; list_double = Arrays.asList(strings); } private MultiItemBaseRecyclerAdapter.MultiItemTypeSupport multiItemTypeSupport = new MultiItemBaseRecyclerAdapter.MultiItemTypeSupport() { @Override public int getLayoutId(int itemType) { switch(itemType){ case 0: return R.layout.item_left; case 1: return R.layout.item_right; default: return -1; } } @Override public int getItemViewType(int position, Object o) { return (position%2==0)?0:1; } }; }

最新回复(0)