文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android中怎么利用RecyclerView实现列表嵌套效果

2023-05-30 22:15

关注

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 BaseMulViewHolder<T extends BaseMulDataModel> extends RecyclerView.ViewHolder {  public BaseMulViewHolder(View itemView) {    super(itemView);  }  protected abstract void bindData(T dataModel);}

这里面多布局中可能涉及到的多个对象,所以基类中的对象类型使用泛型定义,必须是多布局对象基类的子类,这样在后面数据和控件绑定的时候比较方便。

3. 开始创建多布局适配器

public class MullayoutAdapter extends RecyclerView.Adapter<BaseMulViewHolder> {    public static final int TYPE_ONE = 1;  public static final int TYPE_TWO = 2;  public static final int TYPE_THREE = 3;    private List<BaseMulDataModel> 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();  }    public void setDatas(List<BaseMulDataModel> list) {    mList = list;    notifyDataSetChanged();  }  public List<BaseMulDataModel> getDatas() {    return mList;  }    class ViewHolderOne extends BaseMulViewHolder<OneModel> {    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<TwoModel> {    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<ThreeModel> {    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<OneModel> {    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;  }}

进行数据处理

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);    //数据处理    List<BaseMulDataModel> mList = 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实现列表嵌套效果问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯