添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

今天项目中用到了这么一个需求,一个recyclerview中适配多个集合的数据。
效果如下:
这里写图片描述

可能有的人第一反应是recyclerview中再嵌套一个listview,这种方法虽然能实现效果,但是可能会引起滑动冲突,还有就是这里面有两组list数据,如果有三组呢,四组呢,嵌套多少listview啊,今天就说下如何用一个recyclerview实现适配多种list。

咱们将数据分解一下,将上图中的区域1划分为一个类型(String),区域2划分为一个类型(自定义实体类(OpenRecordBean))。
将这两种类型的所有数据依次放入到一个List arrays中,存放完之后,根据上面的需求,这个arrays里面的结构应该是这样的
【String,OpenRecordBean,String,OpenRecordBean,OpenRecordBean,String,OpenRecordBean,OpenRecordBean,OpenRecordBean…….】,在adapter中根据arrays元素的类型,选择不同的布局去加载。

通过这么一说,是不是感觉豁然开朗。下面开始看代码

  • activity中初始化recyclerview,设置adapter,加载模拟数据,这个很简单。里面的数据是我模拟的数据。主要还是看adapter中的代码
* 初始化recyclerview,设置adapter,加载模拟数据 private void initView () { mOpenRecordRv = (RecyclerView) findViewById(R.id.open_record_rv); LinearLayoutManager manager = new LinearLayoutManager( this , LinearLayoutManager.VERTICAL, false ); mOpenRecordRv.setLayoutManager(manager); OpenRecordAddapter addapter = new OpenRecordAddapter(); mOpenRecordRv.setAdapter(addapter); addapter.setDate( new OpenRecordModel().getData());
  • 看下adapter中的代码
    传入数据。
* 传入数据 * @param objects public void setDate (List<Object> objects) { this .objects = objects; notifyDataSetChanged();

根据元素的不同 返回不同的type

   @Override
    public int getItemViewType(int position) {
        if (objects.get(position) instanceof String) {
            return ITEM_TITLE;
        } else if (objects.get(position) instanceof OpenRecordBean.DataBean.LogDOListBean) {
            return ITEM_CONTENT;
        return super.getItemViewType(position);

根据不同的type返回不同的holder

  @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = null;
        RecyclerView.ViewHolder holder = null;
        if (viewType == ITEM_TITLE) {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.open_record_title, parent, false);
            holder = new ViewHolderTitle(view);
        } else if (viewType == ITEM_CONTENT) {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.open_record_content, parent, false);
            holder = new ViewHolderContent(view);
        return holder;

根据holder的不同,填充数据

 @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ViewHolderTitle) {
            String title = (String) objects.get(position);
            ((ViewHolderTitle) holder).mOpenRecordDateTv.setText(title);
        }else if (holder instanceof ViewHolderContent) {
            OpenRecordBean.DataBean.LogDOListBean bean = (OpenRecordBean.DataBean.LogDOListBean) objects.get(position);
        ((ViewHolderContent) holder).mOpenRecordTimeTv.setText(bean.getUpdateTime());
        ((ViewHolderContent) holder).mOpenRecordDoorNOTv.setText(String.valueOf(bean.getOpenType()));
        ((ViewHolderContent) holder).mOpenRecordNameTv.setText(bean.getFullName());
        ((ViewHolderContent) holder).mOpenRecordTerminalTv.setText(bean.getDeviceName());

adapter中的所有代码

package com.testdemo.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.testdemo.R;
import com.testdemo.bean.OpenRecordBean;
import java.util.List;
 * Author:wang_sir
 * Time:2018/6/29 11:16
 * Description:This is HomeAddapter
public class OpenRecordAddapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private int ITEM_TITLE = 1;
    private int ITEM_CONTENT = 2;
    private List<Object> objects;
     * 传入数据
     * @param objects
    public void setDate(List<Object> objects) {
        this.objects = objects;
        notifyDataSetChanged();
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = null;
        RecyclerView.ViewHolder holder = null;
        if (viewType == ITEM_TITLE) {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.open_record_title, parent, false);
            holder = new ViewHolderTitle(view);
        } else if (viewType == ITEM_CONTENT) {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.open_record_content, parent, false);
            holder = new ViewHolderContent(view);
        return holder;
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ViewHolderTitle) {
            String title = (String) objects.get(position);
            ((ViewHolderTitle) holder).mOpenRecordDateTv.setText(title);
        }else if (holder instanceof ViewHolderContent) {
            OpenRecordBean.DataBean.LogDOListBean bean = (OpenRecordBean.DataBean.LogDOListBean) objects.get(position);
        ((ViewHolderContent) holder).mOpenRecordTimeTv.setText(bean.getUpdateTime());
        ((ViewHolderContent) holder).mOpenRecordDoorNOTv.setText(String.valueOf(bean.getOpenType()));
        ((ViewHolderContent) holder).mOpenRecordNameTv.setText(bean.getFullName());
        ((ViewHolderContent) holder).mOpenRecordTerminalTv.setText(bean.getDeviceName());
    @Override
    public int getItemViewType(int position) {
        if (objects.get(position) instanceof String) {
            return ITEM_TITLE;
        } else if (objects.get(position) instanceof OpenRecordBean.DataBean.LogDOListBean) {
            return ITEM_CONTENT;
        return super.getItemViewType(position);
    @Override
    public int getItemCount() {
        return objects == null ? 0 : objects.size();

是不是很简单,以后不管有多少个list数据都能很简单的实现。
本文的demo已提交到
GitHub:https://github.com/DevelopWb/RecyclerviewLoadLists.git
如果感觉帮到了你,记得点赞,点star啊

今天项目中用到了这么一个需求,一个recyclerview中适配多个集合的数据。效果如下:可能有的人第一反应是recyclerview中再嵌套一个listview,这种方法虽然能实现效果,但是可能会引起滑动冲突,还有就是这里面有两组list数据,如果有三组呢,四组呢,嵌套多少listview啊,今天就说下如何用一个recyclerview实现适配多种list。思路: 咱们将数据分解一...
大家先看第一个例子显示: 这个界面相信大家都看到过的,这次比上一个例子多的是ListView 的每一项绑定的是不再是单纯的一个字符串了,ListView 的每一个条目我们需要显示两个信息,编号和姓名.可以看到,我们绑定了十条数据,用了一个for 循环,每一条绑定的时候创建一个HashMap,然后往里面放数据,放的数据有相对应的key, 即id,name,到时候我们取数据的时候就根据这个key 找到我们放进去的数据,有点类似与键值对的意思,不知道这样解释大家明白不明白。 贴上源代码,然后接下来讲解: 代码如下:/**  *    */ package com.cz.list.demo;   i
ScrollView和ListView这两个控件想必大家都不会陌生,但是这两者嵌套使用的时候就会出现麻烦。比如,我们如果想在ListView下面添加其他的布局或者控件,然后想让它们作为一个整体都可以滑动的话,最常想到的就是用一个ScrollView把它们包裹起来。想法似乎很美好,但是现实就有点残酷了。我们可以写一个小例子体验一下。 首先创建一个Activity,在它的布局文件上放置一个ListView: <?xml version=1.0 encoding=utf-8?> <LinearLayout xmlns:android=http://schemas.android.com/
其实在实际开发中,难免会遇到一些类似于需要listview嵌套listview或者RecyclerView嵌套RecyclerView的界面需要实现。作为开发人员的我们,当然希望这种需求越少越好,但是如果偏偏就是有这种需求,用哪一种方式去实现比较好呢?首先看一个很变态的界面效果图,估计很多人看到这个界面的第一眼就是懵逼的,这尼玛什么玩意? 其实倒不是说实现图中的这种效果有多难,而是这种类似于嵌套
scrollview 嵌套recyclerview 时,recyclerview不显示,这就需要我们自己计算recyclerview的高度,比如: ViewGroup.LayoutParams mParams = recyclerView.getLayoutParams(); mParams.height = (CommonUtils.getScreenWidthPX(getAc
import com.example.administrator.storage.R; import com.example.base.ListBaseAdapter; import com.example.base.SuperViewHolder; import com.example.bean.ItemModel; import...
当使用RecyclerView嵌套ListView时,常见的问题就是ListView只能显示一个item 与ScollView嵌套ListView同样的方法不同的是,RecyclerView的Item也就是Listview只是动态设置宽高的时候,仍然会出现ListView显示不全的问题,当ListView的Item数量越多的时候情况就越明显。 此时我们需要把ListView重写一下onMeas
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="m.
org.gradle.tooling.BuildException: Failed to process resources, see aapt output above for details. Caused by: java.lang.ClassNotFoundException: Didn't find class "android.arch.lifecycle.LifecycleRegi