android开发学习 ------- RecyclerView多类型实例
实现RecyclerView多类型的实例:效果如下图所示

public class CarFragment extends Fragment{
private View view;
private RecyclerView recycler;
private CarAdapter madapter ;
int colors[] = {R.color.app_color,R.color.oklib_frame_black,R.color.white};
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle
savedInstanceState) {
view = inflater.inflate(R.layout.fragment_car,container,false);
//在布局中找到定义
recycler = view.findViewById(R.id.recyclerview);
//grid一行有2列的意思
final GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int type = recycler.getAdapter().getItemViewType(position);
if(type == DataModel.TYPE_THREE){
return gridLayoutManager.getSpanCount();
}else{
return 1; //占据一个单元格
}
}
});
//设置布局管理器
// recycler.setLayoutManager(new LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL,
// false));
recycler.setLayoutManager(gridLayoutManager);
madapter = new CarAdapter(getContext());
//设置适配器
recycler.setAdapter(madapter);
//添加item之间的分割线
recycler.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//super.getItemOffsets(outRect, view, parent, state);
GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams();
int spansize = layoutParams.getSpanSize();
int spanindex = layoutParams.getSpanIndex();
outRect.top = 20;
if(spansize != gridLayoutManager.getSpanCount()){
if(spanindex == 1){
outRect.left = 10;
}else{
outRect.right = 10;
}
}
}
});
initData();
return view;
}
/**
* 模拟list集合.
* 针对三种不同的类型,可以去写三个实体类来代替DataModel.
*
*/
private void initData(){
List<DataModel> list = new ArrayList<>();
for(int i = 0;i < 30; i++){
//int type = (int)(Math.random()*3)+1;
int type ;
if( i < 6 || (i>15 && i<20)){
type = 1;
}else if(i<10 || i>26){
type = 2;
}else{
type = 3;
}
DataModel data = new DataModel();
data.avatarColor = colors[type - 1];
data.type = type;
data.content = "content:"+i;
data.name = "name:"+i;
data.contentColor = colors[(type+1)%3];
list.add(data);
}
madapter.addList(list);
madapter.notifyDataSetChanged();
}
}
public class DataModel {
public int type;
public int avatarColor;
public String name;
public String content;
public int contentColor;
/**
* 静态常量去区分类型 , 需要创建三个不同的布局
*/
public static final int TYPE_ONR = 1;
public static final int TYPE_TWO = 2;
public static final int TYPE_THREE = 3;
}
public class CarAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private LayoutInflater mLayoutInfater;
private List<DataModel> mList = new ArrayList<>();
public CarAdapter(Context context) {
mLayoutInfater = LayoutInflater.from(context);
}
public void addList(List<DataModel> list) {
mList.addAll(list);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case DataModel.TYPE_ONR:
return new TypeOneViewHolder(mLayoutInfater.inflate(R.layout.item_car1,parent,false));
case DataModel.TYPE_TWO:
return new TypeTwoViewHolder(mLayoutInfater.inflate(R.layout.item_car2,parent,false));
case DataModel.TYPE_THREE:
return new TypeThreeViewHolder(mLayoutInfater.inflate(R.layout.item_car3,parent,false));
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//判断需要获取哪个数据
int viewType = getItemViewType(position);
((TypeAbstractViewHolder)holder).bindHolder(mList.get(position));
}
@Override
public int getItemCount() {
return mList.size();
}
@Override
public int getItemViewType(int position) {
return mList.get(position).type;
}
}
public class TypeOneViewHolder extends TypeAbstractViewHolder{
public ImageView avator;
public TextView name;
public TypeOneViewHolder(View itemView) {
super(itemView);
avator = itemView.findViewById(R.id.avator);
name = itemView.findViewById(R.id.name);
}
@Override
public void bingHolder(DataModel model) {
avator.setBackgroundResource(model.avatarColor);
name.setText(model.name);
}
}
public class TypeTwoViewHolder extends TypeAbstractViewHolder{
public ImageView avator;
public TextView name;
public TextView content ;
public TypeTwoViewHolder(View itemView) {
super(itemView);
avator = itemView.findViewById(R.id.avator);
name = itemView.findViewById(R.id.name);
content = itemView.findViewById(R.id.content);
}
@Override
public void bingHolder(DataModel model) {
avator.setBackgroundResource(model.avatarColor);
name.setText(model.name);
content.setText(model.content);
}
}
public class TypeThreeViewHolder extends TypeAbstractViewHolder{
public ImageView avator;
public TextView name;
public TextView content ;
public ImageView contentImage;
public TypeThreeViewHolder(View itemView) {
super(itemView);
avator = itemView.findViewById(R.id.avator);
name = itemView.findViewById(R.id.name);
content = itemView.findViewById(R.id.content);
contentImage = itemView.findViewById(R.id.contentImage);
}
@Override
public void bingHolder(DataModel model) {
avator.setBackgroundResource(model.avatarColor);
name.setText(model.name);
content.setText(model.content);
contentImage.setBackgroundResource(model.contentColor);
}
}
fragment_car.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>
item_car1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="60dp"
android:layout_width="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android" >
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:id="@+id/avator"
android:layout_marginLeft="20dp"/>
<TextView
android:id="@+id/name"
android:text="lemon"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> </LinearLayout>
item_car2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="60dp"
android:layout_width="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android" >
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:id="@+id/avator"
android:layout_marginLeft="20dp"/>
<LinearLayout
android:layout_marginLeft="20dp"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/name"
android:text="lemon"
android:textSize="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/content"
android:text="lemon"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
item_car3.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_height="60dp"
android:layout_width="match_parent"
android:gravity="center_vertical"
xmlns:android="http://schemas.android.com/apk/res/android" >
<ImageView
android:layout_centerVertical="true"
android:layout_width="40dp"
android:layout_height="40dp"
android:id="@+id/avator"
android:layout_marginLeft="20dp"/> <LinearLayout
android:id="@+id/ll"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/avator"
android:layout_marginLeft="20dp"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/name"
android:text="lemon"
android:textSize="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/content"
android:text="lemon"
android:layout_marginTop="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout> <ImageView
android:layout_alignParentRight="true"
android:layout_toRightOf="@id/ll"
android:layout_marginRight="20dp"
android:layout_centerVertical="true"
android:id="@+id/contentImage"
android:layout_width="46dp"
android:layout_height="46dp" />
</RelativeLayout>
public abstract class TypeAbstractViewHolder extends RecyclerView.ViewHolder {
public TypeAbstractViewHolder(View itemView) {
super(itemView);
}
public abstract void bindHolder(DataModel model);
}
android开发学习 ------- RecyclerView多类型实例的更多相关文章
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...
- Android开发学习路线图
Android开发学习方法: Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习方法对我们学习Android开发很重要. 在此建议, ...
- android开发学习笔记000
使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...
- Android开发学习总结(一)——搭建最新版本的Android开发环境
Android开发学习总结(一)——搭建最新版本的Android开发环境(转) 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是 ...
- Android开发学习之LauncherActivity开发启动的列表
Android开发学习之LauncherActivity开发启动的列表 创建项目:OtherActivity 项目运行结果: 建立主Activity:OtherActivity.java [jav ...
- 最实用的Android开发学习路线分享
Android开发学习路线分享.Android发展主导移动互联发展进程,在热门行业来说,Android开发堪称火爆,但是,虽然Android有着自身种种优势,但对开发者的专业性要求也是极高,这种要求随 ...
- Android开发学习必备的java知识
Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...
- Android开发学习之路--基于vitamio的视频播放器(二)
终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...
随机推荐
- field 属性操作
首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几种: a)Class.getDeclaredField(String na ...
- UDP 端到端
创建发送端 1.建立DatagramSocket对象,该端点建立,系统会随机分配一个端口,如果不想随机分配,可手动指定. 2.将数据进行packet封装,必须指定目的地址和端口. 3.通过socket ...
- rails elasticsearch searchkick用法
1.安装elasticsearch 之前要先安装java8: 参考https://www.elastic.co/guide/en/elasticsearch/reference/current/zip ...
- 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具
用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件.对呀,平时工作时,想要创建 ...
- HDU3374 String Problem —— 最小最大表示法 + 循环节
题目链接:https://vjudge.net/problem/HDU-3374 String Problem Time Limit: 2000/1000 MS (Java/Others) Me ...
- [Selenium] waitUntilAllAjaxRequestCompletes
private static final String JQUERY_ACTIVE_CONNECTIONS_QUERY = "return $.active == 0;"; pri ...
- DP专辑之线性DP
POJ1390 题目链接:http://poj.org/problem?id=1390 分类:记忆化搜索 dp[i][j][k] 表示,从i到j块且j后面有k块与第j块的颜色一样.dp[l][r][k ...
- C++对象的复制——具有指针成员的类的对象的复制
//smartvessel@gmail.com class Table{ Name * p; size_t sz; publish: Table(size_t s = 15){p = new Name ...
- robotframework:appium切换webview后,在webview里滑动屏幕
问题: 在用robot写手机淘宝app的自动化时,打开手机淘宝后,点击天猫国际,跳转到天猫国际页面,天猫国际页面是H5, 需要切换到对应的webview,切换到webview后,点击美妆菜单,跳转到美 ...
- explain之二:Explain 结果解读与实践,分析诊断工具之二
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...