实现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. C# 自定义控件及引用自动义控件

    1.http://www.cnblogs.com/hjxzjp/p/7823292.html   优先考虑从现有的控件中进行派生,并添加所需要的功能. 在解决方案资源管理器窗口中设置:引用----&g ...

  2. Windows 7 繁体中文MSDN原版

    Win7 SP1 64位旗舰版繁体版ISO镜像(香港):文件名:hk_windows_7_enterprise_with_sp1_x64_dvd_620688.isoSHA1:82D59B099333 ...

  3. (linux)wake_lock机制

      Android的休眠唤醒主要基于wake_lock机制,只要系统中存在任一有效的wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作.wake_lock一般在关闭lcd.tp但 ...

  4. atomic_cmpxchg()/Atomic_read()/Atomic_set()/Atomic_add()/Atomic_sub()/atomi

    [ 1.atomic_read与atomic_set函数是原子变量的操作,就是原子读和原子设置的作用.2.原子操作,就是执行操作的时候,其数值不会被其它线程或者中断所影响3.原子操作是linux内核中 ...

  5. 如何修改织梦dedecms文章标题的最大长度

    织梦dedecms默认的文章标题的最大长度为60字节,如果文章标题超过60字节将会自动截断,导致标题显示不全,这并非是我们所希望的.那么如何将标题长度改成我们想要的?只需简单两步即可解决问题. 1.进 ...

  6. vue中使用axios post上传头像/图片并实时显示到页面

    在前端开发中,为了更好的用户体验,在头像上传时会先将图片显示到页面然后点击保存按钮 完成图片的上传成功 代码部分有参考他人的写法. html代码:   <div id="myPhoto ...

  7. oracle:对Index重建、分析

    对index进行分析,index_stats 表很有用.下面例子就结合index相关操作及 index_stats 的使用,对index进行分析. SQL> select count(*) fr ...

  8. BZOJ_2017_[Usaco2009 Nov]硬币游戏_博弈论+DP

    BZOJ_2017_[Usaco2009 Nov]硬币游戏_博弈论+DP Description 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为“Xoinc”的两人硬币游戏. 初始时,一个有N(5 ...

  9. Cascaded pose regression

    最近再看face alignment的相关文章,目前比较流行的算法都是基于(Cascaded pose regression,CPR)[1]的框架上做的,该算法之所以流行的原因是简单高效.CPR分为训 ...

  10. 2、HTML的head内标签

    一.Meta(metadata information) 提供有关页面的元信息,例:页面编码.刷新.跳转.针对搜索引擎和更新频度的描述和关键词 1.页面编码(告诉浏览器是什么编码) <meta ...