iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >一个Adapter+recycleview实现多种布局,区分布局中
  • 146
分享到

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

androidjavaandroidstudio 2023-08-18 13:08:16 146人浏览 安东尼
摘要

文章目录 🍓🍓简述🍓🍓效果图🍓🍓代码🥭🥭AllAdapter.java🥭🥭

🍓🍓简述

最近因为需要所以学习了一下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;    }    // 获取布局类型,方便分类    @Override    public 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    @Override    public 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;    }    @Override    public 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() {                    @Override                    public 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;        }    }    @Override    public 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    @Override    public 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;    }    @Override    public 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() {            @Override            public void onClick(View view) {                furitSetOnclick.clickGetData(position2,position,holder.mfruitImage);            }        });        holder.mfruitName.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                furitSetOnclick.clickGetData(position2,position,holder.mfruitName);            }        });    }    @Override    public 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    @Override    public 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;    }    @Override    public 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() {            @Override            public void onClick(View view) {                furitSetOnclick.clickGetData(position2,position,holder.mfruitImage);            }        });        holder.mfruitName.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                furitSetOnclick.clickGetData(position2,position,holder.mfruitName);            }        });    }    @Override    public 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

<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">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="80dp"        android:orientation="vertical">        <androidx.recyclerview.widget.RecyclerView            android:id="@+id/recycle_view1"            android:layout_width="match_parent"            android:layout_height="match_parent" />    LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="400dp">        <androidx.recyclerview.widget.RecyclerView            android:id="@+id/recycle_view2"            android:layout_width="match_parent"            android:layout_height="match_parent"/>    LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical">        <androidx.recyclerview.widget.RecyclerView            android:id="@+id/recycle_view3"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_marginLeft="40dp"/>    LinearLayout>LinearLayout>

🍗🍗item1.xml

<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.RecyclerView            android: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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:orientation="horizontal">    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="match_parent"        android:orientation="vertical">        <TextView            android:id="@+id/mTv1"            android:layout_width="match_parent"            android:layout_height="30dp"            android:gravity="center"            android:layout_gravity="center"/>        <ImageView            android:id="@+id/mImg1"            android:layout_width="50dp"            android:layout_height="50dp" />    LinearLayout>LinearLayout>

🍗🍗item3.xml

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

🍗🍗recycle_item3.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:orientation="vertical">    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="vertical"        android:layout_gravity="center">        <ImageView            android:id="@+id/mImg3"            android:layout_width="50dp"            android:layout_height="50dp" />        <TextView            android: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'

来源地址:https://blog.csdn.net/qq_46906413/article/details/126234805

--结束END--

本文标题: 一个Adapter+recycleview实现多种布局,区分布局中

本文链接: https://www.lsjlt.com/news/373999.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一个Adapter+recycleview实现多种布局,区分布局中
    文章目录 🍓🍓简述🍓🍓效果图🍓🍓代码🥭🥭AllAdapter.java🥭🥭...
    99+
    2023-08-18
    android java android studio
  • 同一页面实现recycleView三种布局【recycleView + adapter】
    文章目录 🥭🥭简介🥭🥭效果图🥭🥭代码🍎🍎三个Adapter修饰器...
    99+
    2023-09-08
    android android studio recycleView Adapter 大前端
  • CSS3多栏布局、盒布局和弹性盒布局怎么实现
    本篇内容介绍了“CSS3多栏布局、盒布局和弹性盒布局怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • css布局如何实现左中右布局
    小编给大家分享一下css布局如何实现左中右布局,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果如下:左中右布局<!doctype html>...
    99+
    2023-06-08
  • CSS Positions布局实现多列等高布局的方法
    在网页开发中,实现多列等高布局是一个常见的需求。传统的方法是使用JavaScript来实现,但是这种方法存在兼容性和性能问题。现在我们可以通过使用CSS Positions布局来实现多列等高布局,不仅简单易用,而且效果良好。实现多列等高布局...
    99+
    2023-10-21
    CSS 布局 Positions
  • 如何实现CSS布局中的圣杯布局与双飞翼布局
    这篇文章将为大家详细讲解有关如何实现CSS布局中的圣杯布局与双飞翼布局 ,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。按照我的理解,其实圣杯布局跟双飞翼布局...
    99+
    2024-04-02
  • css中怎么实现一个三栏布局
    css中怎么实现一个三栏布局,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。三栏布局,顾名思义就是两边固定,中间自适应。三栏布局在实际的开发...
    99+
    2024-04-02
  • 使用CSS3怎么实现一个瀑布流布局
    使用CSS3怎么实现一个瀑布流布局?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。掌握点:column-count 把div中的文本分为多少列column-width 规定列宽c...
    99+
    2023-06-08
  • html5中如何实现div布局与table布局
    这篇文章主要介绍了html5中如何实现div布局与table布局,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下div布局:htm...
    99+
    2024-04-02
  • 实现瀑布流布局的三种方式
    前言 今天逛闲鱼的时候观察到每一行的高度不是相同的,经了解才知道原来这是一种瀑布流布局,感觉挺有意思,于是决定研究一下,在网上也找了一些方案,实现瀑布流大概有3种方式。 一、JS 实...
    99+
    2024-04-02
  • css实现flex多列布局
    今天就跟大家聊聊有关css实现flex多列布局,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。基本的等分三列布局.container{    &...
    99+
    2023-06-08
  • css3多列布局怎么实现
    本篇内容主要讲解“css3多列布局怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css3多列布局怎么实现”吧!     colum...
    99+
    2024-04-02
  • AndroidSocket实现多个客户端聊天布局
    本文实例为大家分享了Android Socket实现多个客户端聊天布局的具体代码,供大家参考,具体内容如下 服务器Socket接受到客户端发送的消息之后,转发给容器中的其他Socke...
    99+
    2024-04-02
  • vue+uniapp瀑布流布局多种实现方式示例代码
    目录前言一、实现原理二、代码实现三.uniapp实现四、多列实现总结前言 瀑布流布局是网页设计常见的一种布局,一般用于图片多列展示。列宽固定,图片根据自身高度自适应交错排列。 一、...
    99+
    2023-03-23
    uniapp实现瀑布流 uni-app瀑布流 vue实现瀑布流布局
  • CSS中怎么实现多行多列布局
    本篇文章为大家展示了CSS中怎么实现多行多列布局,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。方案一:标签补位我们都知道,之所以对不齐是因为最后一行的子项目没有达到...
    99+
    2024-04-02
  • css3如何实现多列布局
    css3实现多列布局的方法:通过columns属性实现多列布局,不管你想让一段文本呈多少列显示,只需要设置这两个属性:column-count 和 column-width,其中column-count属性设置列的具体个数,column-w...
    99+
    2024-04-02
  • CSS如何实现10种现代布局
    这篇文章主要介绍了CSS如何实现10种现代布局,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。正文 01. 超级居中在没有 flex 和 grid 之前,垂直居中一直...
    99+
    2023-06-08
  • vue实现多栏布局拖拽
    本文实例为大家分享了vue实现多栏布局拖拽的具体代码,供大家参考,具体内容如下 一、目标 vue 实现多个盒子(用户根据实际场景决定盒子数量)自由拖拽,改变宽度。 二、应用场景 可自...
    99+
    2024-04-02
  • 怎么在css中实现多列布局
    怎么在css中实现多列布局?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一. 定宽 + 自适应期望效果: 左侧宽度固定, 右侧宽度自适应公共代码: html:&...
    99+
    2023-06-08
  • HTML布局指南:如何使用浮动元素实现多栏布局
    HTML布局指南:如何使用浮动元素实现多栏布局浏览网页时,我们常常会看到由多栏组成的布局,例如新闻网站的首页,产品展示页等。这种多栏布局通过将内容划分为多个列,并将它们并排展示,使得网页更加有序和美观。在HTML中,我们可以使用浮动元素来实...
    99+
    2023-10-27
    HTML布局 浮动元素 多栏布局
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作