引言

RecyclerView不只能进行单页面布局,而且可以通过重写adapter中的getItemViewType方法来进行多种View布局,今天就来使用RecyclerView实现复杂的多布局效果。实现一个RecyclerView中嵌套两个RecyclerView的效果,第一个横向滚动的Recycler同时又是纵向RecyclerView的第一个ItemView。话不多说,搞定它!

效果预览

用法

第一步:布局文件(主)

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".blog.Case34"    tools:ignore="MissingConstraints">    <TextView        android:id="@+id/title"        android:layout_width="match_parent"        android:layout_height="?android:attr/actionBarSize"        android:background="@color/green"        android:gravity="center"        android:text="Recycler多布局(两个Recycler)"        android:textColor="@color/white"        android:textSize="20sp" />    <androidx.recyclerview.widget.RecyclerView        android:id="@+id/recycler"        android:layout_width="match_parent"        android:layout_height="0dp"        app:layout_constraintBottom_toBottomOf="parent"        app:layout_constraintTop_toBottomOf="@id/title" />androidx.constraintlayout.widget.ConstraintLayout>

第二步:新建适配器类

/** * @data on 2020/9/27 9:21 AM * @auther armstrong * @describe Recycler多布局(2个Recycler)效果 */public class RecyclerView2TypeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    private final int HOR_RECYCLER = 0;    private final int VER_RECYCLER = 1;    private List banannaList;    private List mangguoList;    private Context mContext;    public RecyclerView2TypeAdapter(Context context, List fruitList1, List fruitList2) {        this.mContext = context;        this.banannaList = fruitList1;        this.mangguoList = fruitList2;    }    @NonNull    @Override    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {        View view;        if (viewType == HOR_RECYCLER) {            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.case34_hor_recycler, parent, false);            return new HorViewHolder(view);        } else {            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.case7_item_fruit, parent, false);            return new VerViewHolder(view);        }    }    @Override    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {        if (holder instanceof HorViewHolder) {            HorViewHolder horViewHolder = (HorViewHolder) holder;            LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);            layoutManager.setOrientation(RecyclerView.HORIZONTAL);            horViewHolder.horRecycler.setLayoutManager(layoutManager);            horViewHolder.horRecycler.setAdapter(new FruitHorRecyclerVIewAdapter(banannaList));        } else if (holder instanceof VerViewHolder) {            VerViewHolder verViewHolder = (VerViewHolder) holder;            verViewHolder.fruitImage.setImageResource(mangguoList.get(position - 1).getImageId());            verViewHolder.fruitName.setText(mangguoList.get(position - 1).getName());        }    }    public static class HorViewHolder extends RecyclerView.ViewHolder {        public RecyclerView horRecycler;        public HorViewHolder(@NonNull View itemView) {            super(itemView);            horRecycler = itemView.findViewById(R.id.hor_recycler);        }    }    public static class VerViewHolder extends RecyclerView.ViewHolder {        public ImageView fruitImage;        public TextView fruitName;        public VerViewHolder(@NonNull View itemView) {            super(itemView);            fruitImage = itemView.findViewById(R.id.fruit_image);            fruitName = itemView.findViewById(R.id.fruit_name);        }    }    @Override    public int getItemCount() {        return mangguoList.size() + 1;    }    @Override    public int getItemViewType(int position) {        if (position == 0) {            return HOR_RECYCLER;        } else {            return VER_RECYCLER;        }    }}

第三步:布局文件(子)

R.layout.case34_hor_recycler

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="wrap_content"    tools:ignore="MissingConstraints">    <androidx.recyclerview.widget.RecyclerView        android:id="@+id/hor_recycler"        android:layout_width="match_parent"        android:layout_height="wrap_content" />androidx.constraintlayout.widget.ConstraintLayout>

R.layout.case7_item_fruit

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="wrap_content">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="@color/white"        android:orientation="horizontal"        android:padding="5dp"        tools:ignore="MissingConstraints">        <ImageView            android:id="@+id/fruit_image"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            tools:ignore="MissingConstraints" />        <TextView            android:id="@+id/fruit_name"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_gravity="center_vertical"            android:layout_marginLeft="10dp"            android:layout_weight="1"            android:gravity="center"            android:textColor="@color/black"            android:textSize="20sp"            tools:ignore="MissingConstraints" />    LinearLayout>androidx.constraintlayout.widget.ConstraintLayout>

第四步:在Activity中书写逻辑代码

public class Case34 extends AppCompatActivity {    private LinearLayoutManager layoutManager;    private List mList1;    private List mList2;    private RecyclerView recycler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_case34);        initView();        layoutManager = new LinearLayoutManager(this);        layoutManager.setOrientation(RecyclerView.VERTICAL);        recycler.setLayoutManager(layoutManager);        recycler.setAdapter(new RecyclerView2TypeAdapter(this,mList1,mList2));    }    private void initView() {        recycler = findViewById(R.id.recycler);        mList1 = new ArrayList();        for (int i = 1; i < 7; i++) {            mList1.add(new Fruit("香蕉" + i, R.mipmap.banana)); //纵向        }        mList2 = new ArrayList();        for (int i = 0; i < 21; i++) {            mList2.add(new Fruit("芒果" + i, R.mipmap.mangguo)); //纵向        }    }}

到这里就结束啦.往期精彩回顾:

  • Android实现短信验证码自动填充功能

  • Android仿echo精美弹幕功能

  • Android实现头像重叠排列功能

  • Android仿QQ个性标签功能

  • Android仿QQ侧滑删除的功能

android zxing-3.3.3的用法_Android使用RecyclerView实现复杂的多布局效果相关推荐

  1. android studio 如何提示方法的用法

    方法/步骤1在 Eclipse中鼠标放上去就可以提示方法的用法,实际上Android Studio也可以设置的.如图 Preferences > Editor >Generan> S ...

  2. Android Service的onStartCommand返回值用法

    2019独角兽企业重金招聘Python工程师标准>>> Android Service的onStartCommand返回值用法 本文目的:使读者快速理解 1.START_STICKY ...

  3. android另类工具,[置顶] android应用程序开发另解及Android SDK工具集的另类用法

    转载请注明出处: LouisWang http://blog.csdn.net/louiswangbing/article/details/6606865 相信对于广大Android应用开发爱好者来说 ...

  4. Android之switch控件的用法

    在做一个蓝牙开关时候,用到了switch,记一下用法,其实跟Button是几乎一样的. 布局中: <Switch android:id="@+id/open" android ...

  5. Android动画之AnimatorSet联合动画用法

    动画入门和进阶文章列表: Animation动画概述和执行原理 Android动画之补间动画TweenAnimation Android动画之逐帧动画FrameAnimation Android动画之 ...

  6. Android zxing,轻松实现二维码扫描、生成

    Android  zxing,轻松实现二维码扫描.生成 一.二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有, ...

  7. android include 控件详解,Android开发中include控件用法分析

    本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...

  8. android datepicker控件,android之datepicker控件的用法

    如下所示: android:orientation="vertical" android:layout_width="wrap_content" android ...

  9. Android数据存储几种方式用法总结

    Android数据存储几种方式用法总结 1.概述 Android提供了5种方式来让用户保存持久化应用程序数据.根据自己的需求来做选择,比如数据是否是应用程序私有的,是否能被其他程序访问,需要多少数据存 ...

最新文章

  1. canvas arcTo()用法详解 – CodePlayer
  2. Android之解析XML
  3. oracle数据库查表_oracle数据库常用的99条查询语句
  4. 深入理解分布式技术 - 配置中心
  5. C# 委托(Delegate)
  6. 浅谈ICA算法的概念、本质和流程
  7. C#连接Excel和Access(包括2003和2007版)方法总结
  8. 51单片机——定时器
  9. Codeforces Round #643 (Div. 2) E. Restorer Distance 题解(三分)
  10. 不是所有的努力都会有结果,但是你若不努力,谁能替你坚强??
  11. netty实战-自定义解码器处理半包消息
  12. 我是如何将Pluto作为library分享到jCenter
  13. 微信集成监控Job状态的功能
  14. MVC和MVVM的区别
  15. 如何给表添加新的字段
  16. 花一万个小时练习 Coding,不要浪费一万小时无谓地 Debugging
  17. 创建一个简易的虚拟桌面
  18. 定义函数 求sinh(x)的值。
  19. 互联网黑市分析之二:安卓地下渠道
  20. Android电量监控

热门文章

  1. 《代码大全》程序员们怎样花费自己的时间
  2. sudo修改文件夹名字_【转载】MAC系统修改帐号短名和个人文件夹名称
  3. python中的is_python中的is
  4. numpy基础笔记01
  5. SpringBoot yml 配置
  6. synchronized的用法介绍
  7. visual c语言编译运行结果,Visual Studio 2015编译运行C语言文件问题小结
  8. 华为大数据中心山西_任正非:华为愿与山西一道建立“煤矿人工智能创新实验室”...
  9. ARCore-Unity3d教程2 - 基本概念
  10. node mysql查询回调_nodejs 数据库查询回调问题