对RecycleView的多种item布局的封装
本文是借鉴bingoogolapple写得BGAAdapter-Android而产生的,对此表示感谢。
效果
1.Adapter的使用
1.继承BaseAdapter
这里是我的adapter
public class RecyclerChatAdapter extends BaseAdapter<ChatModel> {
public Context context;
protected ADUholder holder;
public RecyclerChatAdapter(Context context) {
super();
this.context = context;
}
@Override
public int getItemViewType(int position) {
return mDatas.get(position).type;
}
@Override
protected BaseViewHolder addViewHolder(ViewGroup parent, int viewType) {
View view = null;
switch (viewType) {
case Type.chat:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat, parent, false);
return new ChatHolder(view);
case Type.other:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
return new ADUholder(view);
default://防止空指针
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat, parent, false);
return new ChatHolder(view);
}
}
@Override
protected void fillData(RecyclerView.ViewHolder holder, int position, ChatModel model) {
if (holder instanceof ChatHolder) {
ChatHolder chatHolder = (ChatHolder) holder;
chatHolder.fillData(context, mDatas, position);
} else if (holder instanceof ADUholder) {
ADUholder adUholder = (ADUholder) holder;
adUholder.fillData(context, mDatas, position);
}
}
}
注意这里要实现多item布局就要重写getItemViewType()方法,我们可以在item中的属性中增加一个类型,如我这里是在ChatModel中增加了一个int type;在getItemViewType()获取它。
2.重写addViewHolder()
根据参数viewType来加载不同的item布局,我这里仅仅写了两种,你可以继续增加。
@Override
protected BaseViewHolder addViewHolder(ViewGroup parent, int viewType) {
View view = null;
switch (viewType) {
case Type.chat:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat, parent, false);
return new ChatHolder(view);
case Type.other:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
return new ADUholder(view);
}
return null;
}
3.重写getItemViewType()
代码如下:
@Override
public int getItemViewType(int position) {
return mDatas.get(position).type;
}
这里根据你每个item中的type来返回,对应addViewHolder()方法中的参数viewType。
4.重写fillData()
这里就是填充数据了
@Override
protected void fillData(RecyclerView.ViewHolder holder, int position, ChatModel model) {
if (holder instanceof ChatHolder) {
ChatHolder chatHolder = (ChatHolder) holder;
chatHolder.fillData(context, mDatas, position);
} else if (holder instanceof ADUholder) {
ADUholder adUholder = (ADUholder) holder;
adUholder.fillData(context, mDatas, position);
}
}
adapter这里我们就做完了,剩下了就是ViewHolder。
2.ViewHolder的使用
1.继承BaseViewHolder
我的代码如下:
public class ChatHolder extends BaseViewHolder<ChatModel> {
protected RelativeLayout rl_item_chat_to;
protected RelativeLayout rl_item_chat_from;
protected TextView tv_item_chat_from_msg;
protected TextView tv_item_chat_to_msg;
public ChatHolder(View view) {
super(view);
rl_item_chat_to = findViewById(R.id.rl_item_chat_to);
rl_item_chat_from = findViewById(R.id.rl_item_chat_from);
tv_item_chat_from_msg = findViewById(R.id.tv_item_chat_from_msg);
tv_item_chat_to_msg = findViewById(R.id.tv_item_chat_to_msg);
}
@Override
public void fillData(Context context, List<ChatModel> datas, int position) {
ChatModel model = datas.get(position);
if (model.mUserType == ChatModel.UserType.From) {
rl_item_chat_to.setVisibility(View.GONE);
rl_item_chat_from.setVisibility(View.VISIBLE);
String msg = String.format(mContent.getString(R.string.color_msg_from), model.mMsg);
Spanned htmlMsg = Html.fromHtml(msg);
tv_item_chat_from_msg.setText(htmlMsg,TextView.BufferType.SPANNABLE);
} else {
rl_item_chat_to.setVisibility(View.VISIBLE);
rl_item_chat_from.setVisibility(View.GONE);
String msg = String.format(mContent.getString(R.string.color_msg_from), model.mMsg);
Spanned htmlMsg = Html.fromHtml(msg);
tv_item_chat_to_msg.setText(htmlMsg,TextView.BufferType.SPANNABLE);
}
}
}
2.构造方法
你要实现一个带有View参数的构造方法,我们可以在此做控件绑定。
3.重写fillData()
这里是你真正控件填充数据的地方,对每个item项。
4.另一个ViewHolder
public class ADUholder extends BaseViewHolder<ChatModel> {
public ImageView imageView;
public TextView title;
public TextView name;
public ADUholder(View itemView) {
super(itemView);
imageView = findViewById(R.id.imageView);
title = findViewById(R.id.tv_title);
name = findViewById(R.id.tv_name);
}
@Override
public void fillData(Context context, List<ChatModel> datas, int position) {
ChatModel model = datas.get(position);
title.setText(model.name + position);
name.setText(model.mMsg);
}
}
是不是感觉简单了很多,当然这是我自己的看法。
好了,在此附上github源码,喜欢的请start、fork。 https://github.com/DyncKathline/TestRecyclerView
转载请注明出处,谢谢!
对RecycleView的多种item布局的封装的更多相关文章
- Android RecycleView实现混合Item布局
首先来看看效果吧: 效果预览.png 本实例来自于慕课网的视屏http://www.imooc.com/video/13046,实现步骤可以自己去观看视屏,这里只记录了下实现的代码. 添加依赖: (1 ...
- ListView具有多种item布局——实现微信对话列
这篇文章的效果也是大家常见的,各种通讯应用的对话列表都是这种方式,像微信.whatsapp.易信.米聊等.我们这篇文章也权当为回忆,形成简单的笔记.这篇文章参考了2009年Google IO中的< ...
- ListView实现多种item布局的方法和注意事项
这篇文章的效果也是大家常见的,各种通讯应用的对话列表都是这种方式,像微信.whatsapp.易信.米聊等.我们这篇文章也权当为回忆,形成简单的笔记.这篇文章参考了2009年Google IO中的< ...
- RecyclerView的使用之多种Item加载布局
精益求精,为了更加透彻熟练得掌握,本文再次给大家介石介绍下如何利用RecyclerView实现多Item布局的加载,多Item布局的加载的意思就是在开发过程中List的每一项可能根据需求的不同会加载不 ...
- ListView 完全优化 + 多种listitem布局处理
# 百度了下,感觉下面的博客文章还都挺全面的,写的很好,直接分享得了 Android性能优化--Listview优化 - tonycheng93 - 博客园http://www.cnblogs.co ...
- RecyclerView的使用(2)之多Item布局的载入
原创文章,转载请注明 http://blog.csdn.net/leejizhou/article/details/50708349 李济洲的博客 上一篇介绍的了RecyclerView的基础使用ht ...
- 2.Android 自定义通用的Item布局
转载:http://www.jianshu.com/p/e7ba4884dcdd BaseItemLayout 简介 在工作中经常会遇到下面的一些布局,如图标红处: 05.png 07.png 08. ...
- 【转】Android ListView加载不同的item布局
原创教程,转载请保留出处:http://www.eoeandroid.com/thread-72369-1-1.html 最近有需求需要在listView中载入不同的listItem布局,开始 ...
- RecyclerView实现一个页面有多种item,每个item有多个view,并且可以让任意item的任意view自定义监听,通过接口方法进行触发操作
百度了很多贴子,看着大佬的博客,模仿尝试,最终都是以失败告终,api可能版本不一样, 毕竟博客大佬都是7~8前写的,日期新点的都是好几年前了,多次尝试,还是报出莫名其妙的错. 哎,忧伤. 翻阅各种资料 ...
随机推荐
- ubuntu service
http://blog.chinaunix.net/uid-21528208-id-2399656.html
- Ubuntu下安装Qt4.5(包括X86和ARM版本)
条件:TQ2440开发板,虚拟机安装的Ubuntu10.04,安装好天嵌自带的GCC交叉编译器参考:http://blog.csdn.net/newnewman80/article/details/6 ...
- 队列的实现(JAVA)
定义 队列(queue)是一种特殊的线性表,它只允许在表的前端进行删除,在表的后端进行插入. 进行插入端的称为队尾,进行删除端的称为队头.队列是先进先出原则的.队列的实现同样可以 使用两种方式来 ...
- 【HDOJ】4553 约会安排
线段树.线段树的细节很重要,小数据遍历可以发现问题. /* 4553 */ #include <iostream> #include <string> #include < ...
- Web安全测试之XSS(转)
XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞.指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的 ...
- oracle查询转换_view merge
oracle对于子查询的支持做的很好,oracle optimizer会对inline view进行query transfomation,即视图合并,不过也经常带来意想不到的问题.下面是一个inli ...
- Codevs_1048_石子归并_(动态规划)
描述 http://codevs.cn/problem/1048/ 1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Des ...
- 仿建行JS键盘
一款比较好用的JS密码输入脚本,效果图如下: 代码如下: <html> <head> <script> /*js文件*/ window.onload=functio ...
- HDOJ/HDU 1241 Oil Deposits(经典DFS)
Problem Description The GeoSurvComp geologic survey company is responsible for detecting underground ...
- bzoj 4016 [FJOI2014]最短路径树问题(最短路径树+树分治)
4016: [FJOI2014]最短路径树问题 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 426 Solved: 147[Submit][Stat ...