Android RecyclerView优雅实现复杂列表布局(二)
转载:不一样的RecyclerView优雅实现复杂列表布局(二)_DINGTAO慕枫的博客-CSDN博客_recyclerview复杂布局实现
前言
学习了(一)中那个RecyclerView的一些基础知识,如果没有具体看懂可以再返回看不一样的RecyclerView优雅实现复杂列表布局(一),那么接下来我们就在(一)的基础之上,完善稍微复杂一点数据处理。
不一样的RecyclerView优雅实现复杂列表布局(二)中使用的是GridLayoutManager模式,实现混合使用的效果:
1.首先加载的数据要有所改变,多种形式的数据加载,在MainActivity中模拟出三个数据集合,并根据Adapter中的方法,添加进去。
/*** 此处主要是模拟数据。方便我们测试*/private void initData() {//创建三个数据集合来模拟数据的展示ArrayList<DataModeOne> list1 = new ArrayList<>();for (int i = 0; i < 10; i++) {DataModeOne data = new DataModeOne();data.avatarColor = colors[0];data.name = "name : "+ 1;list1.add(data);}ArrayList<DataModeTwo> list2 = new ArrayList<>();for (int i = 0; i < 10; i++) {DataModeTwo data = new DataModeTwo();data.avatarColor = colors[1];data.name = "name : "+ 1;data.content = "content";list2.add(data);}ArrayList<DataModeThree> list3 = new ArrayList<>();for (int i = 0; i < 10; i++) {DataModeThree data = new DataModeThree();data.avatarColor = colors[2];data.name = "name : "+ 1;data.content = "content";data.contentColor = colors[2];list3.add(data);}/*** 把数据添加到Adapter中去*/mAdapter.addList(list1,list2,list3);mAdapter.notifyDataSetChanged();}
然后模拟出三个实体类,来储存三种类型的数据,虽然和之前的相似,但有所改动:
/*** @author :huangxianfeng on 2017/3/14.* 为了实现三种不同类型的数据类型* 此处虽名称相同,实际中是不同的*/
public class DataModeOne {public int avatarColor;public String name;
}
/*** @author :huangxianfeng on 2017/3/14.* 为了实现三种不同类型的数据类型* 此处虽名称相同,实际中是不同的*/
public class DataModeTwo {public int avatarColor;public String name;public String content;}
/*** @author :huangxianfeng on 2017/3/14.* 为了实现三种不同类型的数据类型* 此处虽名称相同,实际中是不同的*/
public class DataModeThree {public int avatarColor;public String name;public String content;public int contentColor;
}
2.Holder改动的时候,采用了泛型,在TypeAbstractViewHolder类中加入泛型,然后传入不同的数据实体:
/*** @author :huangxianfeng on 2017/3/14.* ViewHolder基类* 每一种布局都封装成一个ViewHolder,继承此类实现BindHolder方法*/
public abstract class TypeAbstractViewHolder<T> extends RecyclerView.ViewHolder{public TypeAbstractViewHolder(View itemView) {super(itemView);}public abstract void bindHolder(T model);
}
此处贴出一例:
/*** @author :huangxianfeng on 2017/3/14.*/
public class TypeOneViewHolder extends TypeAbstractViewHolder<DataModeOne> {public ImageView avatar;public TextView name;public TypeOneViewHolder(View itemView) {super(itemView);avatar = (ImageView)itemView.findViewById(R.id.avatar);name = (TextView)itemView.findViewById(R.id.name);itemView.setBackgroundColor(Color.BLACK);}@Overridepublic void bindHolder(DataModeOne model){avatar.setBackgroundResource(model.avatarColor);name.setText(model.name);}
}
3.在Holder改造完成之后,那么我们看看Adapter的改造:
*** @author :huangxianfeng on 2017/3/14.* RecyclerView的适配器*/
public class DemoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {public static final int TYPE_ONE = 1;public static final int TYPE_TWO = 2;public static final int TYPE_THREE = 3;private LayoutInflater mLayoutInflater;public DemoAdapter(Context context) {mLayoutInflater = LayoutInflater.from(context);}private ArrayList<DataModeOne> list1;private ArrayList<DataModeTwo> list2;private ArrayList<DataModeThree> list3;private ArrayList<Integer> types = new ArrayList<>();private Map<Integer,Integer> mPosition = new HashMap<>();/*** 创建一个方法供外面操作此数据*/public void addList(ArrayList<DataModeOne> list1,ArrayList<DataModeTwo> list2,ArrayList<DataModeThree> list3){addListByType(TYPE_ONE,list1);addListByType(TYPE_TWO,list2);addListByType(TYPE_THREE,list3);this.list1 = list1;this.list2 = list2;this.list3 = list3;}private void addListByType(int type,ArrayList list){mPosition.put(type,types.size());for (int i = 0; i < list.size(); i++) {types.add(type);}}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {switch (viewType){case DataModel.TYPE_ONE:return new TypeOneViewHolder(mLayoutInflater.inflate(R.layout.item_type_one,parent,false));case DataModel.TYPE_TWO:return new TypeTwoViewHolder(mLayoutInflater.inflate(R.layout.item_type_two,parent,false));case DataModel.TYPE_THREE:return new TypeThreeViewHolder(mLayoutInflater.inflate(R.layout.item_type_three,parent,false));}return null;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {int viewType = getItemViewType(position);int realPosition = position -mPosition.get(viewType);switch (viewType){case DataModel.TYPE_ONE:((TypeOneViewHolder)holder).bindHolder(list1.get(realPosition));break;case DataModel.TYPE_TWO:((TypeTwoViewHolder)holder).bindHolder(list2.get(realPosition));break;case DataModel.TYPE_THREE:((TypeThreeViewHolder)holder).bindHolder(list3.get(realPosition));break;}}/*** 多种布局时候至关重要的方法* @param position* @return*/@Overridepublic int getItemViewType(int position) {//得到不同的布局类型return types.get(position);}@Overridepublic int getItemCount() {return types.size();}
}
变动不是很大,就是在onBindViewHolder()方法中添加单个Holder的获取。
4.其中MainActivity中,给RecyclerView添加一个方法实现间距重新赋值:
/*** 设置RecyclerView的间距* 这样可以实现Grid和RecyclerView单条显示时,很好的区分开*/mRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams)view.getLayoutParams();int spanSize = layoutParams.getSpanSize();int spanIndex = layoutParams.getSpanIndex();outRect.top = 20;/*** 不相等时说明是Grid形式显示的* 然后判断是左边还有右边显示,分别设置间距为10*/if (spanSize!=gridLayoutManager.getSpanCount()){if (spanIndex ==1){outRect.left = 10;}else{outRect.right = 10;}}}});
MainActivity全部代码:
public class MainActivity extends AppCompatActivity {private RecyclerView mRecyclerView;private DemoAdapter mAdapter;/*** 随机一下颜色*/int colors[] ={android.R.color.holo_red_dark,android.R.color.holo_blue_dark,android.R.color.holo_orange_dark};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initUI();}private void initUI() {mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);final GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {//得到每个type的值int type = mRecyclerView.getAdapter().getItemViewType(position);if (type == DataModel.TYPE_THREE){return gridLayoutManager.getSpanCount();}else{return 1;}}});mRecyclerView.setLayoutManager(gridLayoutManager);mAdapter = new DemoAdapter(this);mRecyclerView.setAdapter(mAdapter);/*** 设置RecyclerView的间距* 这样可以实现Grid和RecyclerView单条显示时,很好的区分开*/mRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams)view.getLayoutParams();int spanSize = layoutParams.getSpanSize();int spanIndex = layoutParams.getSpanIndex();outRect.top = 20;/*** 不相等时说明是Grid形式显示的* 然后判断是左边还有右边显示,分别设置间距为10*/if (spanSize!=gridLayoutManager.getSpanCount()){if (spanIndex ==1){outRect.left = 10;}else{outRect.right = 10;}}}});initData();}/*** 此处主要是模拟数据。方便我们测试*/private void initData() {//创建三个数据集合来模拟数据的展示ArrayList<DataModeOne> list1 = new ArrayList<>();for (int i = 0; i < 10; i++) {DataModeOne data = new DataModeOne();data.avatarColor = colors[0];data.name = "name : "+ 1;list1.add(data);}ArrayList<DataModeTwo> list2 = new ArrayList<>();for (int i = 0; i < 10; i++) {DataModeTwo data = new DataModeTwo();data.avatarColor = colors[1];data.name = "name : "+ 1;data.content = "content";list2.add(data);}ArrayList<DataModeThree> list3 = new ArrayList<>();for (int i = 0; i < 10; i++) {DataModeThree data = new DataModeThree();data.avatarColor = colors[2];data.name = "name : "+ 1;data.content = "content";data.contentColor = colors[2];list3.add(data);}/*** 把数据添加到Adapter中去*/mAdapter.addList(list1,list2,list3);mAdapter.notifyDataSetChanged();}
}
以上就是所有改造之后的代码
不明白的可以查看:不一样的RecyclerView优雅实现复杂列表布局(一)
继续深入学习更复杂的布局,可以查看: RecycleView 实现复杂首页布局三种方式
更多资源源码下载:
不一样的RecyclerView优雅实现复杂列表布局
android自定义视频播放器
MediaPlayer和SurfaceView的结合使用
FloatingActionButton的使用
多层Fragment与ViewPager结合使用
Android RecyclerView优雅实现复杂列表布局(二)相关推荐
- android开发 RecyclerView 列表布局
android开发 RecyclerView 列表布局 前言 这是一个我早期学习的RecyclerView的博客,最近想整理一下它.后续会一点一点的再次添加内容. 导入 虽然RecyclerView是 ...
- android开发 RecyclerView 瀑布列表布局
android开发 RecyclerView 瀑布列表布局 1.写一个内容的自定义小布局: <?xml version="1.0" encoding="utf-8& ...
- 【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )
文章目录 I . 视图绑定 ( ViewBinding ) 界面的两种方式 II . Activity 界面中 应用 视图绑定 ( ViewBinding ) III . Dialog 对话框界面中 ...
- Android RecyclerView布局动画
In this tutorial, we'll be discussing and implementing RecyclerView Layout Animations in our Android ...
- android搜索框布局文件,android搜索框列表布局,流程及主要步骤思维导图
android搜索框列表布局,流程及主要步骤思维导图 android搜索框列表布局,流程及主要步骤思维导图 activity_coin_search.xml ---------- android:id ...
- Android RecyclerVIew 列表实现 编辑、单选、全选、删除、动画效果(附源码)
前言 眼下都2020年了,你不会还在使用ListView吧? 正文 因为最近写的一个项目里面有关于列表的编辑相关的功能,其实也是类似与腾讯视频的观看历史的列表操作,你可以先尝试一下,写这个主要是业务逻 ...
- android 分割线布局,Android RecyclerView网格布局(支持多种分割线)详解(2)
记录了下RecyclerView的使用方法,并且讲述了线性布局列表的使用方法,在此基础上加上了万能分割线,支持颜色分割线和图片分割线,同时支持对分割线设置线宽. 这篇是总结一下网格布局的使用,同样也支 ...
- android RecyclerView一步步打造分组效果、类似QQ分组、折叠菜单、分组效果(二)
第一篇链接: android RecyclerView一步步打造分组效果.类似QQ分组.折叠菜单.分组效果(一) 注!已更新代码! 上一篇写了分组效果的初步实现: 这一篇就继续增加分组折叠效果和基类的 ...
- Android RecyclerView加载复杂布局
Android RecyclerView加载复杂布局 用一个RecyclerView实现多种复杂布局,复用机制要保存 简书:Android RecyclerView加载复杂布局 demo源码挂载在码云 ...
最新文章
- 如何在 Unix 和 DOS 格式之间转换文本文件
- 美国物理超级计算机,美国科学家在物理学的一个分支领域朝着开发超级计算机迈进了一步。这一分支领域研究的是人眼看不见的粒子。...
- 提高PHP性能的53个技巧
- 【机器视觉】 endif算子
- 权限管理-整合SpringSecurity
- listrecord根据某个属性去重_天刀手游琅纹搭配攻略,全门派全装备最细节提属性教学...
- rocketmq 如何保证高可用_RocketMq容灾、高可用方案
- git 常用命令笔记
- android listview 向上自动滚动效果,Android通过代码控制ListView上下滚动的方法
- 过滤Android工程中多余的资源文件
- 红橙Darren视频笔记 view的invalidate调用draw方法的流程(源码分析基于api 29)
- kz服务器速度显示,CSGO(KZ模式)服务器搭建常见问题答疑(示例代码)
- 在工程图中如何进行虚拟相交点标注
- 【三环集团logo】用Python 小海龟实现~
- 点击微信内网页a标签直接跳转打开淘宝APP的方法实例
- NVMe 协议详解(一)
- 机房收费系统问题集(2)——移动登陆界面+show出子窗体
- 企业微信内自创建app 获取用户信息问题
- 关于固态硬盘闪存芯片研究资料收集
- python爬虫实训第六天
热门文章
- Windows 使用技巧 -- 自定义桌面图标显示
- 如何在表格里做计算机统计表,如何运用Excel编制统计表并做一般数据分析?-excel统计怎么做,最简单的统计表格怎么做...
- 质量管理的三大概念:QA,QC,QM,你能给自己准确定位吗?
- 计算机操作系统-磁盘存储器
- 三星内存编码_三星内存铭牌的详细说明|三星记忆棒标签存储参数的详细说明...
- 【蓝桥杯大赛】简单回忆一下我的蓝桥杯比赛历程
- 【玩转CSS】盒子模型
- 京东云服务器搭建php开发环境
- C++正则表达式(regex_match、regex_search与regex_replace)
- 通俗解释:什么是临床预测模型