实现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多类型实例的更多相关文章

  1. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  2. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  3. Android开发学习路线图

    Android开发学习方法: Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习方法对我们学习Android开发很重要. 在此建议, ...

  4. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

  5. Android开发学习总结(一)——搭建最新版本的Android开发环境

    Android开发学习总结(一)——搭建最新版本的Android开发环境(转) 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是 ...

  6. Android开发学习之LauncherActivity开发启动的列表

    Android开发学习之LauncherActivity开发启动的列表 创建项目:OtherActivity 项目运行结果:   建立主Activity:OtherActivity.java [jav ...

  7. 最实用的Android开发学习路线分享

    Android开发学习路线分享.Android发展主导移动互联发展进程,在热门行业来说,Android开发堪称火爆,但是,虽然Android有着自身种种优势,但对开发者的专业性要求也是极高,这种要求随 ...

  8. Android开发学习必备的java知识

    Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...

  9. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

随机推荐

  1. React通用后台管理系统

    react-admin 部分采用了antd,相关功能较全,添加了较多的组件模块.star 664 GitHub:https://github.com/yezihaohao/react-admin 在线 ...

  2. javascript查找子节点时,html里的换行可能会被当成节点

    1.直接去HTML里找到该换行的地方去掉换行 2.写一个方法把元素类型为空格而且是文本都删除 function del_ff(elem){ var elem_child = elem.childNod ...

  3. JavaScript模板引擎使用

    1. [代码]tmpl.js     // Simple JavaScript Templating// John Resig - http://ejohn.org/ - MIT Licensed(f ...

  4. 【Maven】pom.xml(2)

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. 书写优雅的shell脚本(三) - shell中exec解析

    参考:<linux命令.编辑器与shell编程> <unix环境高级编程> exec和source都属于bash内部命令(builtins commands),在bash下输入 ...

  6. ubuntu openjdk 7 升级 8

    /******************************************************************************* * ubuntu openjdk 7 ...

  7. SKU的结构与页面渲染

    http://blog.jobbole.com/109138/?lwfrom=user_dingfriend

  8. css画三角的原理

    当我们设置一个div其width与height为100px,并且设置其四边框的宽度为100px,且分别设置其颜色后,我们可以看到如下的一张图片 此时如果设置这个div的height为0的话,其他不变, ...

  9. CS231n 2016 通关 第二章-KNN

      课程内容全纪录: 1.讲解图像分类的难点 1.光照强度 2.主体变形 3.主体与背景咬合 4.主体与背景相接近 5.同类别间存在区别 2.KNN 1.最近邻算法 2.Knn 3.hyperpara ...

  10. win10部署Python3和Python2

    首先添加两个的环境变量, 使用python3 -m pip -v (后面为自己的pip命令) 工具: pip install you-get you-get -url