今天项目中用到了这么一个需求,一个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啊