一个Adapter+recycleview实现多种布局,区分布局中

news/2024/4/29 9:56:02/文章来源:https://blog.csdn.net/qq_46906413/article/details/126234805

文章目录

  • 🍓🍓简述
  • 🍓🍓效果图
  • 🍓🍓代码
    • 🥭🥭AllAdapter.java
    • 🥭🥭 FuritAdapter3.java
    • 🥭🥭MainActivity.java(主函数)
    • 🥭🥭FuritBean.java(对象的属性)
    • 🥭🥭msgcode.java(一些常量抽取出来)
    • 🥭🥭传值
  • 🍓🍓xml布局
    • 🍗🍗activity_main.xml
    • 🍗🍗item1.xml
    • 🍗🍗item2.xml
    • 🍗🍗item3.xml
    • 🍗🍗recycle_item3.xml

🍓🍓简述

最近因为需要所以学习了一下recycleview,使用Adapter修饰器修饰,使用一个Adapter+recycleview实现多种布局,而不是之前的三个Adapter在同一个recycleview中实现三个布局。点击区分布局中的gridview的图片和姓名。

嗯~,算是之前的在同一个recycleview中实现三个不同布局的升级版吧。因为之前使用了三个Adapter【修饰器】,而这个只是用了一个Adapter【修饰器】



🍓🍓效果图

动态图》》》
在这里插入图片描述



🍓🍓代码

🥭🥭AllAdapter.java

package Adapter;import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.lifecycle.GenericLifecycleObserver;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import com.example.layout_test.MainActivity;
import com.example.layout_test.R;import org.jetbrains.annotations.NotNull;import java.util.List;import domain.FuritBean;import static domain.msgcode.TYPE_1;
import static domain.msgcode.TYPE_2;
import static domain.msgcode.TYPE_3;public class AllAdapter extends RecyclerView.Adapter<AllAdapter.ViewHolder> {private List<FuritBean> mFruitList;private RecyclerView mRecycleView;private OnItemClickListener mOnItemClickListener;public int Position1,Position2;private View View;class ViewHolder extends RecyclerView.ViewHolder{private final ImageView mfruitImage;private final TextView mfruitName;private final RecyclerView mRecycleView,mRecycleView2;public ViewHolder(@NonNull @NotNull View view) {super(view);mfruitImage=view.findViewById(R.id.mImg1);mfruitName=view.findViewById(R.id.mTv1);mRecycleView=view.findViewById(R.id.recycle_item);mRecycleView2=view.findViewById(R.id.recycle_item2);// todo 此处添加两个方法//添加一个OnItemClickListener接口,并且定义两个方法public interface OnItemClickListener{void onClick(int position1,int position2,View view);}//然后定义一个监听的方法,便于主类调用public void setOnItemListener(OnItemClickListener onItemListener){this.mOnItemClickListener = onItemListener;}// 构造方法public AllAdapter(List<FuritBean> mFruitList) {this.mFruitList = mFruitList;}// 获取布局类型,方便分类@Overridepublic int getItemViewType(int position) {if (position ==1|| position ==4 || position==9){return TYPE_1;}else if(position == TYPE_2){return TYPE_2;}else {return TYPE_2;}}//    @Override
//    public long getItemId(int position) {
//        return position;
//    }//  根据布局类型,返回不同的view  ViewHolder@NonNull@NotNull@Overridepublic AllAdapter.ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {View view = null;ViewHolder viewHolder = null;switch (viewType){case TYPE_1:view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item1,parent,false);viewHolder=new ViewHolder(view);break;case TYPE_2:view=LayoutInflater.from(parent.getContext()).inflate(R.layout.item2,parent,false);viewHolder=new ViewHolder(view);break;}return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull @NotNull AllAdapter.ViewHolder holder, int position) {switch (getItemViewType(position)){case TYPE_1:ViewHolder viewHolder=holder;GridLayoutManager gridLayoutManager=new GridLayoutManager(viewHolder.mRecycleView.getContext(),5);viewHolder.mRecycleView.setLayoutManager(gridLayoutManager);FuritAdapter3 furitAdapter3=new FuritAdapter3(mFruitList,position);/*** 取得数据*/furitAdapter3.FSetonclick(new FuritAdapter3.FuritSetOnclick() {@Overridepublic void clickGetData(int position, int position2,View view) {mOnItemClickListener.onClick(position,position2,view);}});viewHolder.mRecycleView.setAdapter(furitAdapter3);break;case TYPE_2:ViewHolder viewHolder2=holder;FuritBean furit1=mFruitList.get(position);viewHolder2.mfruitImage.setImageResource(furit1.getImageId());viewHolder2.mfruitName.setText(furit1.getName());break;default:break;}}@Overridepublic int getItemCount() {return mFruitList.size();}
}

🥭🥭 FuritAdapter3.java

package Adapter;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.example.layout_test.R;import org.jetbrains.annotations.NotNull;import java.util.List;import domain.FuritBean;public class FuritAdapter3 extends RecyclerView.Adapter<FuritAdapter3.ViewHolder> {private List<FuritBean> mFruitList;private FuritSetOnclick furitSetOnclick;private int position2;static class ViewHolder extends RecyclerView.ViewHolder{private final ImageView mfruitImage;private final TextView mfruitName;public ViewHolder(@NonNull @NotNull View itemView) {super(itemView);mfruitImage= itemView.findViewById(R.id.mImg3);mfruitName = itemView.findViewById(R.id.mTv3);}}public FuritAdapter3(List<FuritBean> mFruitList, int position) {this.mFruitList = mFruitList;this.position2 = position;}@NonNull@Overridepublic FuritAdapter3.ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item3,parent,false);ViewHolder viewHolder=new ViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull @NotNull FuritAdapter3.ViewHolder holder, int position) {FuritBean furit=mFruitList.get(position);holder.mfruitImage.setImageResource(furit.getImageId());holder.mfruitName.setText(furit.getName());holder.mfruitImage.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {furitSetOnclick.clickGetData(position2,position,holder.mfruitImage);}});holder.mfruitName.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {furitSetOnclick.clickGetData(position2,position,holder.mfruitName);}});}@Overridepublic int getItemCount() {return mFruitList.size();}//  定义一个监听接口,里面有两个方法public interface FuritSetOnclick{void clickGetData(int position,int position2,View view);}//给监听一个构造函数,提供给  MainActivity  调用public void FSetonclick(FuritSetOnclick furitSetOnclick){this.furitSetOnclick=furitSetOnclick;}
}

🥭🥭MainActivity.java(主函数)

package Adapter;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.example.layout_test.R;import org.jetbrains.annotations.NotNull;import java.util.List;import domain.FuritBean;public class FuritAdapter3 extends RecyclerView.Adapter<FuritAdapter3.ViewHolder> {private List<FuritBean> mFruitList;private FuritSetOnclick furitSetOnclick;private int position2;static class ViewHolder extends RecyclerView.ViewHolder{private final ImageView mfruitImage;private final TextView mfruitName;public ViewHolder(@NonNull @NotNull View itemView) {super(itemView);mfruitImage= itemView.findViewById(R.id.mImg3);mfruitName = itemView.findViewById(R.id.mTv3);}}public FuritAdapter3(List<FuritBean> mFruitList, int position) {this.mFruitList = mFruitList;this.position2 = position;}@NonNull@Overridepublic FuritAdapter3.ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item3,parent,false);ViewHolder viewHolder=new ViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull @NotNull FuritAdapter3.ViewHolder holder, int position) {FuritBean furit=mFruitList.get(position);holder.mfruitImage.setImageResource(furit.getImageId());holder.mfruitName.setText(furit.getName());holder.mfruitImage.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {furitSetOnclick.clickGetData(position2,position,holder.mfruitImage);}});holder.mfruitName.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {furitSetOnclick.clickGetData(position2,position,holder.mfruitName);}});}@Overridepublic int getItemCount() {return mFruitList.size();}//  定义一个监听接口,里面有两个方法public interface FuritSetOnclick{void clickGetData(int position,int position2,View view);}//给监听一个构造函数,提供给  MainActivity  调用public void FSetonclick(FuritSetOnclick furitSetOnclick){this.furitSetOnclick=furitSetOnclick;}
}

🥭🥭FuritBean.java(对象的属性)

package domain;public class FuritBean {private String name;private int ImageId;public String getName() {return name;}public int getImageId() {return ImageId;}public FuritBean(String name, int imageId) {this.name = name;ImageId = imageId;}
}

🥭🥭msgcode.java(一些常量抽取出来)

package domain;public class msgcode {public static final int TYPE_1=0;public static final int TYPE_2=5;public static final int TYPE_3=6;
}

🥭🥭传值

因为同一个recycleView实现多种布局,其中就有gridview【九宫格布局】。要想在同一个recycleview实现多种布局,而且还要实现每个gridview的监听,常规的办法肯定是不行的。

这就涉及到嵌套了。那么嵌套怎么从最里层的gridview传出每一个小格子中的图片点击和名称点击呢? 当然使用接口了,具体可以看代码,建议掌握,Android这样的场景太多太多。

虽然gridview传出每一个小格子中的图片点击和名称点击的view不同,可以使用view.getId进行区分,具体效果看上面截图。


🍓🍓xml布局

🍗🍗activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="80dp"android:orientation="vertical"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycle_view1"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="400dp"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycle_view2"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycle_view3"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="40dp"/></LinearLayout></LinearLayout>

🍗🍗item1.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"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycle_item"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="30dp"></androidx.recyclerview.widget.RecyclerView>
</LinearLayout>

🍗🍗item2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/mTv1"android:layout_width="match_parent"android:layout_height="30dp"android:gravity="center"android:layout_gravity="center"/><ImageViewandroid:id="@+id/mImg1"android:layout_width="50dp"android:layout_height="50dp" /></LinearLayout>
</LinearLayout>

🍗🍗item3.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"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycle_item2"android:layout_width="match_parent"android:layout_height="80dp"></androidx.recyclerview.widget.RecyclerView>
</LinearLayout>

🍗🍗recycle_item3.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:layout_gravity="center"><ImageViewandroid:id="@+id/mImg3"android:layout_width="50dp"android:layout_height="50dp" /><TextViewandroid:id="@+id/mTv3"android:layout_width="50dp"android:layout_height="30dp"android:gravity="center"android:textColor="#FFFF0000"/></LinearLayout></LinearLayout>

在这里插入图片描述

最后一步,别忘了导入recycleview的依赖
在这里插入图片描述

implementation 'androidx.recyclerview:recyclerview:1.1.0'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_224169.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【全网热点】打造全网最全爱心代码仓库【火速领取爱心】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【代码实践】 目录&#x1f319;正文&#x1f30f;部分效果在线演示&#x1f30f;部分效果截屏&#x1f338;文末祝…

个人设计web前端大作业 基于html5制作美食菜谱网页设计作业代码

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Linux的前世今生

14天学习训练营导师课程&#xff1a; 互联网老辛《 符合学习规律的超详细linux实战快速入门》 努力是为了不平庸~ 学习有些时候是枯燥的&#xff0c;但收获的快乐是加倍的&#xff0c;欢迎记录下你的那些努力时刻&#xff08;学习知识点/题解/项目实操/遇到的bug/等等&#xf…

2022年深度学习最新研究成果

一、开源深度学习编译器 二、 开源深度学习加速器 三、AITemplate引擎 四、微型机器学习框架 参考文献&#xff1a;https://arxiv.org/pdf/1510.00149.pdf 五、Contrastive Learning 对比学习综述 六、Diffusion Model 扩散模型综述 Diffusion Models: A Comprehensive Surv…

Java面向对象中阶(七)

面向对象中阶 1、包 2、访问修饰符 3、封装 4、继承 5、方法重写(override) 6、多态 7、Object类的常用方法 8、断点调试 1、包 包的本质&#xff1a; 实际上就是创建不同的文件夹来保存类文件 包的三大作用&#xff1a; 区分相同名字的类当类很多时&#xff0c;可以…

【freeRTOS】操作系统之六-低功耗模式

六&#xff0c;低功耗模式 本章节为大家讲解 FreeRTOS 本身支持的低功耗模式 tickless 实现方法&#xff0c;tickless 低功耗机制是当前小型 RTOS 所采用的通用低功耗方法&#xff0c;比如 embOS&#xff0c;RTX 和 uCOS-III&#xff08;类似方法&#xff09;都有这种机制。ti…

原来背后都是商业利益,看到网易和暴雪的解约之后,原来是要定以后的KPI,坐地起价,但是一个时代已经结束了,都留在了记忆之中

1&#xff0c;大瓜新闻&#xff0c;2023年1月暴雪游戏中国将不会续约&#xff1f;&#xff1f; 2&#xff0c;原因是主要坐地起价&#xff0c;提高分成设置KPI 还好网易有自研游戏&#xff0c;估计早知道会有现在这样的情况。 提前做好了准备。还记得有个公司叫 九城吗&#x…

创建自己的函数库

创建自己的函数库前言一、什么是STM32标准函数库1.定义&#xff1a;2.作用&#xff1a;3.对比&#xff1a;二、构建库函数1.修改寄存器地址封装2.定义访问的结构体指针和引脚3.创建封装函数3.1创建拉低引脚函数3.2创建引脚初始化函数总结前言 回顾一下&#xff0c;前面点亮led…

堆 (带图详解)

文章目录1.堆的基本概念1. 概念2.性质1.必须为完全二叉树2.满足大堆/小堆成立的条件3.存储方式1.逻辑结构2.物理结构4. 孩子与父亲之间下标的关系2.堆的基本实现1.push——插入1.代码2. 情况分析情况1情况23. 向上调整算法1.过程分析2. 临界条件的判断2. pop—— 删除1.代码2. …

redis哨兵系列1

需要配合源码一起康~ 9.1 哨兵基本概念 官网手册yyds&#xff1a;https://redis.io/docs/manual/sentinel/ redis主从模式&#xff0c;如果主挂了&#xff0c;需要人工将从节点提升为主节点&#xff0c;通知应用修改主节点的地址。不是很友好&#xff0c;so Redis 2.8之后开…

C# async / await 用法

目录 一、简介 二、异步等待返回结果 三、异步方法返回类型 四、await foreach 五、Task.Delay 结束 一、简介 await 运算符暂停对其所属的 async 方法的求值&#xff0c;直到其操作数表示的异步操作完成。 异步操作完成后&#xff0c;await 运算符将返回操作的结果&…

使用STM32CubeMX实现按下按键,电平反转

需提前学习&#xff1a;使用STM32CubeMX实现LED闪烁 目录 原理图分析 按键部分原理图分析 LED部分原理图分析 STM32CubeMX配置 关于STM32CubeMXSYS的Debug忘记配置Serial Wire处理办法 GPIO配置 LED的GPIO配置 KEY1配置 关于PA0后面这个WKUP是什么&#xff1f; 那么啥…

利用ogg微服务版将oracle同步到kafka

ogg微服务版可以再界面上配置抽取、复制进程&#xff0c;不必进入到shell中进行配置&#xff0c;并且图形化界面可以看到更多信息。 系统架构 源端安装ogg for oracle 19C , 目标端安装ogg for bigdata 21C kafka 2.2 数据库&#xff1a;19C 所有软件安装在同台服务器上&#…

理解Linux32位机器下虚拟地址到物理地址的转化

文章目录前言一、基本概念介绍二、虚拟地址到物理地址的转化过程总结前言 简要介绍LINUX32位系统下虚拟地址到物理地址的转化过程。 一、基本概念介绍 在32位机器下&#xff0c;IO的基本单位是块&#xff08;块&#xff1a;4kb),在程序编译成可执行程序时也划分好了以4kb为单…

JVM【类加载与GC垃圾回收机制】

JVM【类加载与GC垃圾回收机制】&#x1f34e;一.JVM&#x1f352;1.1JVM简介&#x1f352;1.2JVM执行流程&#x1f34e;二.JVM运行时数据区&#x1f352;2.1 程序计数器(线程私有)&#x1f352;2.2 栈(线程私有)&#x1f352;2.3 堆(线程共享)&#x1f352;2.4 方法区(线程共享…

OWASP API SECURITY TOP 10

目录 1. API 安全风险 2. 细说TOP10 1. Broken Object Level Authorization 2. Broken User Authentication 3 Excessive Data Exposure 4 Lack of Resources & Rate Limiting 5 Broken Function Level Authorization 6 Mass Assignment 7 security misconfigura…

【原创】使用Golang的电商搜索技术架构实现

作者&#xff1a;黑夜路人 时间&#xff1a;2022年11月 一、背景&#xff1a; 现在搜索技术已经是非常主流的应用技术&#xff0c;各种优秀的索引开源软件已经很普遍了&#xff0c;比如 Lucene/Solr/Elasticsearch 等等主流搜索索引开源软件&#xff0c;让我们搭建一个优秀的…

【FLASH存储器系列十】Nand Flash芯片使用指导之一

目录 1.1 芯片简介 1.2 功能框图 1.3 存储结构 1.4 信号定义 1.5 双平面&#xff08;plane&#xff09;操作 1.6 Die间交错操作 1.7 错误管理 今天以MT29F8G08AJADAWP芯片为例&#xff0c;说明nand flash的操作方法。 1.1 芯片简介 这是一款镁光的容量8Gb&#xff0c;总…

liunx集成jmeter进行压测实践

首先liunx环境需要部署jdk 1,获取jmeter免安装包&#xff1a;点击我获取免安装包 2,获取jmeter-manger工具&#xff0c;用于生成报告&#xff0c;日志等 点击我获取工具 3,在服务器上新建一个文件夹存放jmeter&#xff0c;推荐在/usr/local/下面&#xff0c;我这里由于权限问…

E 排队(排列组合)[牛客小*白月赛61]

题面如下&#xff1a; 思路 or 题解&#xff1a; 对于一个长度为 nnn 的 排列组合 如果存在一对 逆序对 (x,y)(x, y)(x,y) xxx 在 yyy 的前面有 n∗(n−1)2\frac{n * (n - 1)}{2}2n∗(n−1)​ 种情况 剩下 n−2n - 2n−2 个位置可以随意填数进去&#xff0c;不会影响到逆序对 …