android中实现双列表联动功能

就是一个数据展示的功能,左边是目录、右边是详情列表。效果图如下:

实现的思路,就是左右一个列表,右边的列表里面嵌套一个列表,一共三个列表。

第一步:先写一个主页面布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".Activity.PageEffect.recycleview.doubleList.DoubleListActivity">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_left"
        android:layout_width="100dp"
        android:layout_height="wrap_content"/>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_right"
        android:layout_toRightOf="@+id/rv_left"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

第二步:写一个左边适配器

public class LeftAdapter extends RecyclerView.Adapter<LeftAdapter.LeftHolder>{
    Context context;
    List<LeftBean> list;
    OnItemClickListener onItemClickListener;
    public LeftAdapter(Context context, List<LeftBean> list){
        this.context=context;
        this.list=list;
    }
    @NonNull
    @Override
    public LeftHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.item_recycleview_left,parent,false);
        return new LeftHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull LeftHolder holder, @SuppressLint("RecyclerView") int position) {
        holder.typeTv.setText(list.get(position).getType());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onItemClickListener!=null){
                    onItemClickListener.onItemClick(v,position);
                }
            }
        });
        if (list.get(position).isSelected()){
            holder.leftRl.setBackgroundColor(Color.parseColor("#0000ff"));
            holder.typeTv.setTextColor(Color.parseColor("#00ff00"));
        }else {
            holder.leftRl.setBackgroundColor(Color.parseColor("#00ff00"));
            holder.typeTv.setTextColor(Color.parseColor("#666666"));
        }
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class LeftHolder extends RecyclerView.ViewHolder {
        RelativeLayout leftRl;
        TextView typeTv;
        public LeftHolder(@NonNull View itemView) {
            super(itemView);
            leftRl=itemView.findViewById(R.id.rl_left);
            typeTv=itemView.findViewById(R.id.tv_type);
        }
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    public interface OnItemClickListener{
        void onItemClick(View v,int position);
    }

    public void setList(List<LeftBean> list) {
        this.list = list;
    }
}

第三步,写左边列表的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl_left"
    android:layout_width="100dp"
    android:layout_height="60dp">
    <TextView
        android:id="@+id/tv_type"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="30sp"
        android:gravity="center"/>
</RelativeLayout>

第四步,写右边列表适配器

public class RightAdapter extends RecyclerView.Adapter<RightAdapter.RightHolder>{
    private Context context;
    private List<RightBean> list;

    public RightAdapter(Context context, List<RightBean> list) {
        this.context = context;
        this.list = list;
    }

    @NonNull
    @Override
    public RightHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.item_recycleview_right,parent,false);
        return new RightHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RightHolder holder, int position) {
        holder.typeTv.setText(list.get(position).getType());
        holder.recyclerView.setLayoutManager(new GridLayoutManager(context,2));
        holder.recyclerView.setAdapter(new RightDetailAdapter(context,list.get(position).getDetailList()));
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class RightHolder extends RecyclerView.ViewHolder {
        TextView typeTv;
        RecyclerView recyclerView;
        public RightHolder(@NonNull View itemView) {
            super(itemView);
            typeTv=itemView.findViewById(R.id.tv_right_type);
            recyclerView=itemView.findViewById(R.id.rv_right_detail);
        }
    }

    public void setList(List<RightBean> list) {
        this.list = list;
    }
}

第五步:写右边列表的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/tv_right_type"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textSize="30sp"
        android:textColor="@color/blue"
        android:gravity="center_vertical"
        android:textStyle="bold"/>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_right_detail"
        android:layout_below="@+id/tv_right_type"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</RelativeLayout>

第六步,写右边列表里面嵌套的详情列表适配器

public class RightDetailAdapter extends RecyclerView.Adapter<RightDetailAdapter.RightDetailHolder>{
    private Context context;
    private List<RightBean.Detail> list;
    public RightDetailAdapter(Context context,List<RightBean.Detail> list){
        this.context=context;
        this.list=list;
    }
    @NonNull
    @Override
    public RightDetailHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.item_recycleview_right_detail,parent,false);
        return new RightDetailHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RightDetailHolder holder, int position) {
        holder.nameTv.setText(list.get(position).getName());
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class RightDetailHolder extends RecyclerView.ViewHolder {
        TextView nameTv;
        public RightDetailHolder(@NonNull View itemView) {
            super(itemView);
            nameTv=itemView.findViewById(R.id.tv_name);
        }
    }

    public void setList(List<RightBean.Detail> list) {
        this.list = list;
    }
}

第七步,写详情列表的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="30dp">
    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@mipmap/ic_launcher"/>
    <TextView
        android:id="@+id/tv_name"
        android:layout_below="@id/iv_icon"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:gravity="center"
        android:textSize="24sp"
        android:textColor="@color/green"/>
</RelativeLayout>

第八步,在主Activity里面写具体的联动方法

public class DoubleListActivity extends AppCompatActivity {
    private RecyclerView leftRv;
    private LeftAdapter leftAdapter;
    private List<LeftBean> leftBeanList=new ArrayList<>();

    private RecyclerView rightRv;
    private RightAdapter rightAdapter;
    private List<RightBean> rightBeanList=new ArrayList<>();

    private int currentPosition = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_double_list);
        initView();
    }
    private void initView(){
        leftRv=findViewById(R.id.rv_left);
        leftBeanList.add(new LeftBean("名酒",false));
        leftBeanList.add(new LeftBean("名烟",false));
        leftBeanList.add(new LeftBean("饮料",false));
        leftBeanList.add(new LeftBean("手机",false));
        leftAdapter=new LeftAdapter(this,leftBeanList);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        leftRv.setLayoutManager(linearLayoutManager);
        leftRv.setAdapter(leftAdapter);

        rightRv=findViewById(R.id.rv_right);
        RightBean rightBean=new RightBean();
        rightBean.setType("名酒");
        List<RightBean.Detail> detailList=new ArrayList<>();
        detailList.add(new RightBean.Detail("茅台"));
        detailList.add(new RightBean.Detail("五粮液"));
        detailList.add(new RightBean.Detail("剑南春"));
        detailList.add(new RightBean.Detail("汾酒"));
        detailList.add(new RightBean.Detail("花雕"));
        detailList.add(new RightBean.Detail("红酒"));
        rightBean.setDetailList(detailList);
        rightBeanList.add(rightBean);
        RightBean rightBean2=new RightBean();
        rightBean2.setType("名烟");
        List<RightBean.Detail> detailList2=new ArrayList<>();
        detailList2.add(new RightBean.Detail("中华"));
        detailList2.add(new RightBean.Detail("玉溪"));
        detailList2.add(new RightBean.Detail("双喜"));
        detailList2.add(new RightBean.Detail("小苏"));
        detailList2.add(new RightBean.Detail("黄鹤楼"));
        rightBean2.setDetailList(detailList2);
        rightBeanList.add(rightBean2);
        RightBean rightBean3=new RightBean();
        rightBean3.setType("饮料");
        List<RightBean.Detail> detailList3=new ArrayList<>();
        detailList3.add(new RightBean.Detail("可乐"));
        detailList3.add(new RightBean.Detail("雪碧"));
        detailList3.add(new RightBean.Detail("冰红茶"));
        detailList3.add(new RightBean.Detail("绿茶"));
        detailList3.add(new RightBean.Detail("脉动"));
        detailList3.add(new RightBean.Detail("冰糖雪梨"));
        rightBean3.setDetailList(detailList3);
        rightBeanList.add(rightBean3);
        RightBean rightBean4=new RightBean();
        rightBean4.setType("手机");
        List<RightBean.Detail> detailList4=new ArrayList<>();
        detailList4.add(new RightBean.Detail("华为"));
        detailList4.add(new RightBean.Detail("魅族"));
        detailList4.add(new RightBean.Detail("小米"));
        detailList4.add(new RightBean.Detail("红米"));
        detailList4.add(new RightBean.Detail("三星"));
        detailList4.add(new RightBean.Detail("长虹"));
        rightBean4.setDetailList(detailList4);
        rightBeanList.add(rightBean4);
        rightAdapter=new RightAdapter(this,rightBeanList);
        LinearLayoutManager linearLayoutManager_right = new LinearLayoutManager(this);
        rightRv.setLayoutManager(linearLayoutManager_right);
        rightRv.setAdapter(rightAdapter);

        leftAdapter.setOnItemClickListener(new LeftAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View v, int position) {
                for(int i=0;i<leftBeanList.size();i++){
                    if (i==position){
                        leftBeanList.get(i).setSelected(true);
                    }else {
                        leftBeanList.get(i).setSelected(false);
                    }
                }
                leftAdapter.setList(leftBeanList);
                leftAdapter.notifyDataSetChanged();
                LinearLayoutManager linearLayoutManager_right= (LinearLayoutManager)rightRv.getLayoutManager();
                if (linearLayoutManager_right!=null){
                    linearLayoutManager_right.scrollToPositionWithOffset(position,0);
                }
            }
        });
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            rightRv.setOnScrollChangeListener(new View.OnScrollChangeListener() {
                @Override
                public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                    LinearLayoutManager linearLayoutManager_right= (LinearLayoutManager) rightRv.getLayoutManager();
                    LinearLayoutManager linearLayoutManager_left= (LinearLayoutManager) leftRv.getLayoutManager();
                    if (linearLayoutManager_right!=null&&linearLayoutManager_left!=null){
                        currentPosition=linearLayoutManager_right.findFirstVisibleItemPosition();
                        if (linearLayoutManager_left.findFirstVisibleItemPosition()>currentPosition){
                            linearLayoutManager_left.scrollToPositionWithOffset(currentPosition,0);
                        }else if (linearLayoutManager_left.findFirstVisibleItemPosition()<currentPosition){
                            linearLayoutManager_left.scrollToPositionWithOffset(currentPosition,0);
                        }
                        if (!rightRv.canScrollVertically(1)){
                            currentPosition=leftBeanList.size()-1;
                        }
                        for(int i=0;i<leftBeanList.size();i++){
                            if (i==currentPosition){
                                leftBeanList.get(i).setSelected(true);
                            }else {
                                leftBeanList.get(i).setSelected(false);
                            }
                        }
                        leftAdapter.setList(leftBeanList);
                        leftAdapter.notifyDataSetChanged();
                    }
                }
            });
        }
    }
}

另外两个ben类代码如下

public class LeftBean {
    private String type;
    private boolean selected;

    public LeftBean(String type, boolean selected) {
        this.type = type;
        this.selected = selected;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }

    @Override
    public String toString() {
        return "LeftBean{" +
                "type='" + type + '\'' +
                ", selected=" + selected +
                '}';
    }
}
public class RightBean {
    public String type;
    public List<Detail> detailList;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public List<Detail> getDetailList() {
        return detailList;
    }

    public void setDetailList(List<Detail> detailList) {
        this.detailList = detailList;
    }

    @Override
    public String toString() {
        return "RightBean{" +
                "type='" + type + '\'' +
                ", detailList=" + detailList +
                '}';
    }

    public static class Detail{
        String name;

        public Detail(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Detail{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
}

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

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

相关文章

在GPU上运行PyTorch

文章目录 1、查看GPU的CUDA版本2、下载CUDA版本3、安装cuDNN4、配置CUDA环境变量5、安装配置Anaconda6、使用Anaconda7、pycharm导入虚拟环境8、安装带GPU的PyTorch⭐9、总结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#x…

轻量级自适用商城卡密发卡源码(可运营)

一款全开源非常好看的发卡源码。轻量级自适应个人自助发卡简介&#xff0c;这是一款二次开发的发卡平台源码修复原版bug,删除无用的代码。所有文件全部解密&#xff0c;只保留后台版权信息内容。大家放心使用&#xff0c;可以用于商业运营。轻量级自适应个人自助发卡。 源码下…

【海外云手机】静态住宅IP集成解决方案

航海大背景下&#xff0c;企业和个人用户对于网络隐私、稳定性以及跨国业务的需求日益增加。静态住宅IP与海外云手机的结合&#xff0c;提供了一种创新的集成解决方案&#xff0c;能够有效应对这些需求。 本篇文章分为三个部分&#xff1b;静态住宅优势、云手机优势、集成解决…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(一)——流形;

新建了一个专栏&#xff0c;仔细学习高翔的新书《自动驾驶与机器人中的SLAM技术》。 快速通读了一遍&#xff0c;发现还有很多需要深入学习的东西&#xff0c;因此二刷这本书。对于自己不懂的地方&#xff0c;通过这个笔记记录这个流程。 第一个问题&#xff1a;流形。 流形学…

Spring Boot项目的404是如何发生的

问题 在日常开发中&#xff0c;假如我们访问一个Sping容器中并不存在的路径&#xff0c;通常会返回404的报错&#xff0c;具体原因是什么呢&#xff1f; 结论 错误的访问会调用两次DispatcherServlet&#xff1a;第一次调用无法找到对应路径时&#xff0c;会给Response设置一个…

uniapp页面跳转传参和动态修改NavigationBarTitle

一、需求 比如聊天界面&#xff0c;需要在上方展示对方的名字&#xff0c;我们这样需要动态数值的&#xff0c;就不能写在pages配置项里面。 二、实现 我们并没有在pages里面配置固定的title名&#xff0c;我们需要动态传到talk&#xff0c;然后动态修改绑定到这个title。好在u…

从零开始学量化~Ptrade使用教程(六)——盘后定价交易、港股通与债券通用质押式回购

盘后固定价交易 实现科创板、创业板的盘后固定价交易&#xff0c;界面如下显示&#xff1a; 交易 输入科创板或创业板代码&#xff0c;选择委托方向&#xff0c;输入委托价格、委托数量&#xff0c;点击“买入”或“卖出”按钮进行委托。可出现一个委托提示框提示是否继续委托操…

HCNA VRP基础

交换机可以隔离冲突域&#xff0c;路由器可以隔离广播域&#xff0c;这两种设备在企业网络中应用越来越广泛。随着越来越多的终端接入到网络中&#xff0c;网络设备的负担也越来越重&#xff0c;这时网络设备可以通过专有的VRP系统来提升运行效率。通过路由平台VRP是华为公司数…

怎么录屏?Windows和Mac电脑都适用的3种方法

在数字化时代的浪潮中&#xff0c;电脑录屏已经成为一种必备技能。无论是为了制作教学视频&#xff0c;记录游戏的高光时刻、还是为了保存下欢乐时光&#xff0c;录屏功能都在我们当中发挥着重要的作用。但是怎么录屏也成为一个难题&#xff0c;有时候用的电脑不一样&#xff0…

基于搜索二叉树的停车收费管理系统

系统效果&#xff1a;录入汽车信息 查看汽车信息 收费信息查看 查询车库车辆 代码展示&#xff1a; //SearchBinaryTree.h #pragma once #include<iostream> #include<string> #include<time.h> #include<Windows.h> using namespace std;template<…

ArkTS学习笔记_UI界面的状态管理简述

ArkTS学习笔记_UI界面的状态管理简述 背景&#xff1a; 我们在UI开发中&#xff0c;绝大多数的UI界面都是动态的、有用户交互的&#xff0c;为了实现动态交互&#xff0c;引入了一个概念“状态”&#xff0c;它主要是用来记录管理UI界面的状态变化&#xff08;数据变化&#x…

08 模型演化根本 深度学习推荐算法的五大范式

易经》“九三&#xff1a;君于终日乾乾&#xff1b;夕惕若&#xff0c;厉无咎”。九三是指阳爻在卦中处于第三位&#xff0c;已经到达中位&#xff0c;惕龙指这个阶段逐渐理性&#xff0c;德才已经显现&#xff0c;会引人注目&#xff1b;但要反思自己的不足&#xff0c;努力不…

ubuntu上模拟串口通信

前言 有时候写了一些串口相关的程序&#xff0c;需要调试的时候&#xff0c;又没有硬件&#xff0c;或者需要等其他模块完成才能一起联调。这样搭建环境费时费力&#xff0c;很多问题等到最后联调才发现就已经很晚了。 本文提供一种在ubuntu环境下模拟串口&#xff0c;直接就可…

django报错(一):python manage.py makemigrations,显示“No changes detected”

执行python manage.py makemigrations命令无任何文件生成&#xff0c;结果显示“No changes detected”。 解决方案一&#xff1a; 1、执行命令&#xff1a;python manage.py makemigrations –empty appname 2、删除其中的0001_initial.py文件&#xff08;因为这个文件内容是…

vue2+antd实现表格合并;excel效果

效果图 一、html <template><div><a-table :columns"columns" :dataSource"dataSource" rowKey"id" :pagination"false" bordered><template slot"content1" slot-scope"text">{{text}}…

单臂路由组网实验,单臂路由的定义、适用情况、作用

一、定义 单臂路由是指通过在路由器的一个接口上配置许多子接口,从而实现原来相互隔离的不同VLAN之间的互通。 子接口:把路由器上的实际的物理接口划分为多个逻辑上的接口,这些被划分的逻辑接口就是子接口。 二、适用情况 用在没有三层交换机,却要实现不同VLAN之间的互…

element ui中el-form-item的属性rules的用法

目录 el-form-item的属性rules的用法 栗子 总结 实践应用 一、 定义静态的校验规则 二、定义动态的校验规则 el-form-item的属性rules的用法 在学习element ui 的Form表单组件时&#xff0c;学到el-form-item也有rules属性&#xff0c;但是对应这个属性如何使用&#x…

【linux】服务器安装及卸载pycharm社区版教程

【linux】服务器安装及卸载pycharm社区版教程 【创作不易&#xff0c;求点赞关注收藏】 文章目录 【linux】服务器安装及卸载pycharm社区版教程1、到官网下载安装包2、通过终端wget下载安装包3、解压4、安装5、设置环境变量6、运行pycharm7、删除pycharm安装包、卸载pycharm …

前端JS特效第34集:jQuery俩张图片局部放大预览插件

jQuery俩张图片局部放大预览插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Co…

大数据环境下的房地产数据分析与预测研究的设计与实现

1绪论 1.1研究背景及意义 随着经济的快速发展和城市化进程的推进&#xff0c;房地产市场成为了国民经济的重要组成部分。在中国&#xff0c;房地产行业对经济增长、就业创造和资本投资起到了重要的支撑作用。作为中国西南地区的重要城市&#xff0c;昆明的房地产市场也备受关…