【面包屑】快速使用RecyclerView搭建列表
16lz
2021-01-24
以下示例为搭建一个表格形式的列表。里面的 item 可以设置占用不同的列数。
Adapter示例:
public class SampleRecyclerViewAdapter extends RecyclerView.Adapter { public enum ItemType{ TYPE_A, TYPE_B, } private List mDataSet; private Context mContext; public SampleRecyclerViewAdapter(Context context, List dataSet) { mDataSet = dataSet; mContext = context; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { /** * 不同类型卡片需要不同类型布局的话,在这设置 */ if (ItemType.TYPE_A.ordinal() == viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.layout_a, parent, false); RecyclerView.ViewHolder vh = new AViewHolder(v); return vh; } else if (ItemType.TYPE_B.ordinal() == viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.layout_b, parent, false); RecyclerView.ViewHolder vh = new BViewHolder(v); return vh; } return null; } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); /** * 根据需要调整单个卡片所占列数 */ RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); if(manager instanceof GridLayoutManager) { final GridLayoutManager gridManager = ((GridLayoutManager) manager); gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { if (ItemType.TYPE_A == mDataSet.get(position).mType) { //占一列 return 1; } else if (ItemType.TYPE_B == mDataSet.get(position).mType) { //占两列 return 2; } return 1; } }); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { DataItem item = mDataSet.get(position); /** * 不同布局的 item 需要不同的 ViewHolder */ if (ItemType.TYPE_A == item.mType) { AViewHolder aViewHolder = (AViewHolder) viewHolder; aViewHolder.tv.setText(item.a); } else if(ItemType.TYPE_B == item.mType) { BViewHolder bViewHolder = (BViewHolder) viewHolder; bViewHolder.iv.setImageDrawable(item.b); } } @Override public int getItemViewType(int position) { /** * 如果有多种类型的卡片,需要在这里给定卡片的类型的判断规则 */ return mDataSet.get(position).mType.ordinal() ; } @Override public int getItemCount() { return mDataSet.size(); } /** * APP 类型卡片的ViewHolder */ private static class AViewHolder extends RecyclerView.ViewHolder { TextView tv; public AViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.text_a); } } /** * 主卡片的 ViewHolder */ private class BViewHolder extends RecyclerView.ViewHolder { ImageView iv; public BViewHolder(View itemView) { super(itemView); iv = (ImageView) itemView.findViewById(R.id.image_b); } } /** * 各个卡片单元的基础数据对象 */ public static class DataItem{ SampleRecyclerViewAdapter.ItemType mType; String a; Drawable b; public void setType(SampleRecyclerViewAdapter.ItemType type) { mType = type; } public void setA(String s) { a = s; } public void setB(Drawable d) { b = d; } }}
布局文件示例:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text_a" android:layout_width="wrap_content" android:layout_height="wrap_content" />RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image_b" android:layout_width="wrap_content" android:layout_height="wrap_content" />RelativeLayout>
最终调用方法示例
private void test() { List dataset = new ArrayList<>(); SampleRecyclerViewAdapter.DataItem a = new SampleRecyclerViewAdapter.DataItem(); a.setA("test"); SampleRecyclerViewAdapter.DataItem b = new SampleRecyclerViewAdapter.DataItem(); b.setB(getResources().getDrawable(R.drawable.ic_launcher)); dataset.add(a); dataset.add(b); mRecyclerView = (RecyclerView) findViewById(R.id.sample_recycler_view); mRecyclerView.setHasFixedSize(true); // 使用表格布局管理器,并设置列数为2。用于演示不同类型item可以占用不同的列数 mLayoutManager = new GridLayoutManager( mRecyclerView.getContext(), 2, GridLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(mLayoutManager); mAdapter = new SampleRecyclerViewAdapter(this, dataset); mRecyclerView.setAdapter(mAdapter); }
更多相关文章
- 曾经的笔记——android的学习笔记(布局和电话、短信权限)
- GitHub 优秀的 Android(安卓)开源项目
- Android四大组件之activity之间带数据跳转
- Android(安卓)使用BroadCast实现强制下线功能
- Android(安卓)之 五大布局案例
- 【转】 Array ,Simple ,SimpleCursor Adapter 区别
- Drawer实现左右侧滑DrawerLayout
- Android(安卓)CardView+RecyclerView实现卡片列表
- Android(安卓)pulltorefresh上拉下拉刷新加载