重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Android中怎么利用RecyclerView实现列表嵌套效果,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站制作、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的鄂州网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
1. 定义多布局对象的基类:
public class BaseMulDataModel { protected int type; public int getType() { return type; } public void setType(int type) { this.type = type; } }
type是该对象对应的布局类型。
2. recyclerview数据的显示放在ViewHolder中,定义Holder基类
public abstract class BaseMulViewHolderextends RecyclerView.ViewHolder { public BaseMulViewHolder(View itemView) { super(itemView); } protected abstract void bindData(T dataModel); }
这里面多布局中可能涉及到的多个对象,所以基类中的对象类型使用泛型定义,必须是多布局对象基类的子类,这样在后面数据和控件绑定的时候比较方便。
3. 开始创建多布局适配器
public class MullayoutAdapter extends RecyclerView.Adapter{ /** * 定义三种布局类型 */ public static final int TYPE_ONE = 1; public static final int TYPE_TWO = 2; public static final int TYPE_THREE = 3; /** * 数据集合 */ private List mList; @Override public BaseMulViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //根据不同的布局类型,设置创建相关的holder switch (viewType) { case TYPE_ONE: return new ViewHolderOne(LayoutInflater.from(parent.getContext()) .inflate(R.layout.layout_holder1, parent, false)); case TYPE_TWO: return new ViewHolderTwo(LayoutInflater.from(parent.getContext()) .inflate(R.layout.layout_holder2, parent, false)); case TYPE_THREE: return new ViewHolderThree(LayoutInflater.from(parent.getContext()) .inflate(R.layout.layout_holder3, parent, false)); } return null; } @Override public void onBindViewHolder(BaseMulViewHolder holder, int position) { //绑定数据 holder.bindData(mList.get(position)); } @Override public int getItemCount() { return mList.size(); } @Override public int getItemViewType(int position) { return mList.get(position).getType(); } /** * 设置数据 * * @param list */ public void setDatas(List list) { mList = list; notifyDataSetChanged(); } public List getDatas() { return mList; } /** * 设置第一个布局的数据 */ class ViewHolderOne extends BaseMulViewHolder { TextView textView; public ViewHolderOne(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.holder1_tv); } @Override protected void bindData(OneModel dataModel) { textView.setText(dataModel.getTitle()); } } /** * 设置第二个布局的数据 */ class ViewHolderTwo extends BaseMulViewHolder { ImageView imageView; public ViewHolderTwo(View itemView) { super(itemView); imageView = (ImageView) itemView.findViewById(R.id.holder2_iv); } @Override protected void bindData(TwoModel dataModel) { imageView.setImageResource(dataModel.getRes()); } } /** * 设置第三个布局的数据 */ class ViewHolderThree extends BaseMulViewHolder { TextView textView; public ViewHolderThree(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.holder3_tv); } @Override protected void bindData(ThreeModel dataModel) { textView.setText(dataModel.getNote()); } } }
首先这边涉及到布局类型:头部、内容列表、底部。定义三种类型
/** * 定义三种布局类型 */ public static final int TYPE_ONE = 1; public static final int TYPE_TWO = 2; public static final int TYPE_THREE = 3;
根据布局类型来创建对应的ViewHolder对象
public BaseMulViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //根据不同的布局类型,设置创建相关的holder switch (viewType) { case TYPE_ONE: return new ViewHolderOne(LayoutInflater.from(parent.getContext()) .inflate(R.layout.layout_holder1, parent, false)); case TYPE_TWO: return new ViewHolderTwo(LayoutInflater.from(parent.getContext()) .inflate(R.layout.layout_holder2, parent, false)); case TYPE_THREE: return new ViewHolderThree(LayoutInflater.from(parent.getContext()) .inflate(R.layout.layout_holder3, parent, false)); } return null; }
当然事先创建对应的Holder类:
/** * 设置第一个布局的数据 */ class ViewHolderOne extends BaseMulViewHolder{ TextView textView; public ViewHolderOne(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.holder1_tv); } @Override protected void bindData(OneModel dataModel) { textView.setText(dataModel.getTitle()); } }
这边把泛型对象擦除,使用具体对象OneModel来作为当前的数据对象。OneModel是BaseMulDataModel的基类。
OneModel的定义:
public class OneModel extends BaseMulDataModel { private String title; public OneModel(String title, int type) { this.title = title; this.type = type; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
4. 进行数据处理
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler); LinearLayoutManager layoutManager = new LinearLayoutManager(this); recycler.setLayoutManager(layoutManager); final MullayoutAdapter adapter = new MullayoutAdapter(); recycler.setAdapter(adapter); //数据处理 ListmList = new ArrayList<>(); for (int i = 0; i < 5; i++) { mList.add(new OneModel("头部" + i, MullayoutAdapter.TYPE_ONE)); for (int j = 0; j < 3; j++) { mList.add(new TwoModel(R.mipmap.ic_launcher, MullayoutAdapter.TYPE_TWO)); } mList.add(new ThreeModel("底部" + i, MullayoutAdapter.TYPE_THREE)); } adapter.setDatas(mList); } }
关于Android中怎么利用RecyclerView实现列表嵌套效果问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。