RecyclerView网格布局

RecyclerView网格布局GridLayoutMa

GridLayoutManager

一、 引入问题

在这里插入图片描述

要实现这个布局,我们需要怎么做呢?

  1. 用线性布局画各种长度尺寸的button?
    可行,但扩展性不够,假如将第二行和第三行互换位置呢 再增加几行呢 再增加几种类型的item呢?

  2. 我们可以试下recyclerview的网格布局,进行动态适配各行的item
    可行,扩展性够

二、解决问题

方案:使用recyclerview的网格布局 
  1. 定义itemType,针对不同的类型填充不同的布局

这里我们用不同itemType,之后可以在任意位置扩展这些类型的item

  1. 核心代码
public class MainActivity extends AppCompatActivity { 
    private RecyclerView mRecyclerView; private RecyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = findViewById(R.id.recycler_view); init(); } public void init() { 
    GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(), 3); mRecyclerView.setLayoutManager(gridLayoutManager); mAdapter = new RecyAdapter(); mRecyclerView.setAdapter(mAdapter); gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
    @Override public int getSpanSize(int position) { 
    int itemViewType = mAdapter.getItemViewType(position); switch (itemViewType) { 
    case Constant.THREE_COLUME_ITEM_TYPE: return 3; case Constant.TWO_COLUME_ITEM_TYPE: return 2; default: return 1; } } }); mRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { 
    @Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { 
    super.getItemOffsets(outRect, view, parent, state); outRect.bottom = 30; outRect.left = 30; } }); } } 
public class RecyAdapter extends RecyclerView.Adapter { 
    private List<Integer> mData = new ArrayList<>(); public RecyAdapter() { 
    mData.add(0); mData.add(1); mData.add(2); mData.add(3); mData.add(4); mData.add(5); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 
    View view; int layoutId; switch (viewType) { 
    case Constant.THREE_COLUME_ITEM_TYPE: layoutId = R.layout.item_three_view_layout; break; case Constant.TWO_COLUME_ITEM_TYPE: layoutId = R.layout.item_two_view_layout; break; default: layoutId = R.layout.item_view_layout; break; } view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false); return new VH(view); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { 
    VH vh = (VH) holder; vh.mText.setText(mData.get(position) + ""); } @Override public int getItemCount() { 
    return mData.size(); } @Override public int getItemViewType(int position) { 
    switch (position) { 
    case 0: return Constant.THREE_COLUME_ITEM_TYPE; case 5: return Constant.TWO_COLUME_ITEM_TYPE; default: return Constant.ONE_COLUME_ITEM_TYPE; } } class VH extends RecyclerView.ViewHolder { 
    TextView mText; public VH(@NonNull View itemView) { 
    super(itemView); mText = itemView.findViewById(R.id.text); } } } 
public class Constant { 
    public static final int THREE_COLUME_ITEM_TYPE = 0; public static final int ONE_COLUME_ITEM_TYPE = 1; public static final int TWO_COLUME_ITEM_TYPE = 2; } 

三、实现效果

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218406.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午7:20
下一篇 2026年3月18日 上午7:20


相关推荐

  • 邮箱接收验证码登录

    邮箱接收验证码登录开发工具与关键技术 VSNVC 作者 听民谣的老猫撰写时间 2019 7 2511 07 已经讲过通过账号密码来进行用户的登录 今天就来讲讲邮箱发送动态密码实现用户登录 再讲这个功能之前你得去邮箱获取一下授权码 首先登录自己的邮箱 找到设置 找到账户 下滑到这里将画红圈的点击开启 选择一种验证方式 获取授权码 然后记住

    2025年10月14日
    9
  • 什么是哥德尔不完备定理?

    什么是哥德尔不完备定理?到底什么是哥德尔不完备性定理 总结成一句话就是 任何包含了自然数论的形式体系中 自洽性和完备性必定无法同时满足 可能有点绕 我们一个概念一个概念的解释一下 首先是自然数论 自然数论也叫皮亚诺算数 这个体系是基于五大基础公里之上建立起来的 它们分别是 0 是自然数 每一个确定的自然数 都具有确定的后继数 也是自然数 例如等等

    2026年3月18日
    2
  • JetBrains WebStorm 安装教程

    JetBrains WebStorm 安装教程首先声明,此方法仅用来参考学习,不得用于商业用途,请支持正版,学生可以免费申请到正版软件。网上有很多激活成功教程方法,可能不同的版本不一样,这篇文章就只针对JetBrainsWebStorm2018.1.5×64版本的软件。因为本人用的就是这个版本,亲测有效。——————2019年10月首先需要下载一个jar包:JetbrainsIde…

    2022年6月16日
    47
  • Seedance 2.0基础使用教程指南

    Seedance 2.0基础使用教程指南

    2026年3月13日
    4
  • 关于 Head First SQL 中文版

    关于 Head First SQL 中文版

    2021年12月1日
    45
  • 深挖P2P传输技术,升级与创新并举

    深挖P2P传输技术,升级与创新并举你用过P2P传输吗?现在的P2P传输可以说是继局域网、ftp、http之后最广泛使用的文件分享和传播途径,被众多企业运用在工作中。P2P传输,全称“点对点传输”,是一种文件即时传输方式,目标是让所有客户端都能提供资源,包括带宽、存储空间、计算能力。P2P传输技术有很多应用,包括共享各种格式音频、视频、数据等。**P2P传输技术是如何实现即时传输?为什么P2P传输可以被众多企业接受?**本文,我们将带着这两个问题出发,深挖P2P传输技术。一、一张图看懂P2P传输技术传统的http传输是服务器上直接复制

    2022年7月16日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号