今天项目中用到了这么一个需求,一个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());
* 传入数据
*
@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