RecyclerView多级联动_多个recyclerview层级联动_铜锣烧_的博客-程序员秘密

技术标签: android  工作日志  

效果图:

 

思路:

用addView的方式添加三个recyclerview,使用LinearLayout横向布局,权重weight平分。

代码:

public class Test2Activity extends AppCompatActivity {
    private LinearLayout parentView;
    private RecyclerView recyclerView1, recyclerView2, recyclerView3;
    private List<DataBean> siteData; // 列表1数据
    private List<StationBean> stationData; // 列表2数据
    private List<DeviceBean> deviceData; // 列表3数据
    private boolean isAddSecondView = false;
    private boolean isAddThirdView = false;
    private int lastPosV1 = -1;
    private int lastPosV2 = -1;
    private int lastPosV3 = -1;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.popup_linkage_recyclerview);
        // widget
        parentView = findViewById(R.id.parentView);

        // 实例化
        siteData = new ArrayList<>();

        // 取数据
        String str = FileUtils.readMemory2(this, FileUtils.SITE_DATA_NAME);
        if (!TextUtils.isEmpty(str)) {
            BSDBean bsdBean = new Gson().fromJson(str, BSDBean.class);
            siteData.addAll(bsdBean.getData());
        } else {
            Toast.makeText(this, "暂无数据", Toast.LENGTH_LONG).show();
            return;
        }

        // set first recyclerview
        recyclerView1 = new RecyclerView(this);
        LinearLayoutManager llManager = new LinearLayoutManager(this);
        llManager.setOrientation(RecyclerView.VERTICAL);
        recyclerView1.setLayoutManager(llManager);
        // adapter
        LinkageSiteAdapter siteAdapter = new LinkageSiteAdapter(this, siteData);
        recyclerView1.setAdapter(siteAdapter);

        // set second recyclerview
        recyclerView2 = new RecyclerView(this);
        LinearLayoutManager llManager2 = new LinearLayoutManager(this);
        llManager2.setOrientation(RecyclerView.VERTICAL);
        recyclerView2.setLayoutManager(llManager2);
        // adapter
        stationData = new ArrayList<>();
        LinkageStationAdapter stationAdapter = new LinkageStationAdapter(this, stationData);
        recyclerView2.setAdapter(stationAdapter);

        // set third recyclerview
        recyclerView3 = new RecyclerView(this);
        LinearLayoutManager llManager3 = new LinearLayoutManager(this);
        llManager3.setOrientation(RecyclerView.VERTICAL);
        recyclerView3.setLayoutManager(llManager3);
        // adapter
        deviceData = new ArrayList<>();
        LinkageDeviceAdapter deviceAdapter = new LinkageDeviceAdapter(this, deviceData);
        recyclerView3.setAdapter(deviceAdapter);

        // add first recyclerview
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1f);
        parentView.addView(recyclerView1, 0, lp);

        // click listener
        // 列表1
        siteAdapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
                // 更新recyclerview1当前选中item的状态
                adapter.notifyItemChanged(position, 0);
                // 上一次点击的item恢复为默认效果(未选中状态)
                if (lastPosV1 > -1 && lastPosV1 != position) {
                    adapter.notifyItemChanged(lastPosV1);
                }
                lastPosV1 = position;

                // add second recyclerview
                lastPosV2 = -1;
                if (!stationData.isEmpty()) {
                    stationData.clear();
                }
                stationData.addAll(siteData.get(position).getStation());
                stationAdapter.notifyDataSetChanged();
                // 未添加recyclerView2
                if (!isAddSecondView) {
                    LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f);
                    parentView.addView(recyclerView2, 1, lp2);
                    isAddSecondView = true;
                }

                // clear device list data
                if (!deviceData.isEmpty()){
                    deviceData.clear();
                    deviceAdapter.notifyDataSetChanged();
                }
            }
        });

        // 列表2
        stationAdapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
                // 更新recyclerview2当前选中状态
                adapter.notifyItemChanged(position, 1);
                // 上一次点击的item恢复默认效果(未选中状态)
                if (lastPosV2 > -1 && lastPosV2 != position) {
                    adapter.notifyItemChanged(lastPosV2);
                }
                lastPosV2 = position;

                // add third recyclerview
                lastPosV3 = -1;
                if (!deviceData.isEmpty()) {
                    deviceData.clear();
                }
                deviceData.addAll(stationData.get(position).getDevice());
                deviceAdapter.notifyDataSetChanged();
                // 未添加recyclerview3
                if (!isAddThirdView) {
                    LinearLayout.LayoutParams lp3 = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1f);
                    parentView.addView(recyclerView3, 2, lp3);
                    isAddThirdView = true;
                }
            }
        });

        // 列表3
        deviceAdapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
                // 更新recyclerview3当前选中状态
                adapter.notifyItemChanged(position, 2);
                // 上一次点击的item恢复默认效果(未选中状态)
                if (lastPosV3 > -1 && lastPosV3 != position) {
                    adapter.notifyItemChanged(lastPosV3);
                }
                lastPosV3 = position;
            }
        });
    }

}

public class LinkageSiteAdapter extends BaseQuickAdapter<DataBean, BaseViewHolder> {
    private final int normal_color;
    private final int select_color;

    public LinkageSiteAdapter(Context context, @Nullable List<BSDBean.DataBean> data) {
        super(R.layout.item, data);
        normal_color = context.getResources().getColor(R.color.c3);
        select_color = context.getResources().getColor(R.color.c4);
    }

    @Override
    protected void convert(@NotNull BaseViewHolder baseViewHolder, BSDBean.DataBean dataBean) {
        // 获取当前item的position
        int position = baseViewHolder.getLayoutPosition();
        String tv = dataBean.getBureau().getName();
        baseViewHolder.setText(R.id.name, tv);

        RelativeLayout relRootView = baseViewHolder.findView(R.id.relRootView);
        relRootView.setBackgroundColor(normal_color);
    }

    @Override
    public void onBindViewHolder(@NotNull BaseViewHolder holder, int position, @NotNull List<Object> payloads) {
        super.onBindViewHolder(holder, position, payloads);
        if (payloads.isEmpty()) {
            onBindViewHolder(holder, position);
        } else {
            RelativeLayout relRootView = holder.findView(R.id.relRootView);
            relRootView.setBackgroundColor(select_color);
        }
    }

}

说明:recyclerview点击item背景变色的代码有点点问题,这里根据需求修改,以上代码只是思路记录。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lanziEVOL/article/details/125442358

智能推荐

httpd 的坑_anmin1992的博客-程序员秘密

Httpd服务器的坑在/etc/httpd/conf/httpd.conf中的配置信息, 有时注释到的内容仍然会生效配置Auth时, 允许htpasswd规定的文件中的所有的用户, Require valid-uesr, 允许特定的用户Require user user1 user2 user3 ...允许组, Require group group1 group2在Cent...

ElasticSearch搜索引擎学习(一)_拖着阳光的黄叶的博客-程序员秘密

1.创建索引库使用postman或curl这样的工具创建:put http://localhost:9200/索引库名称{ "settings":{ "index":{ "number_of_shards":1, "number_of_replicas":0 } }}2.创建映射post http://localhost:9200/索引库名称/类型名称/_map...

echarts(javascript的图表库)_echarts js_爱敲代码的小旗的博客-程序员秘密

简单介绍一下echarts他是javascript的图表库,有百度捐赠给apache基金会的,因为他不想D3和heightCharts一样 比较符合中国人的习惯优点丰富的图表类型提供开箱即用的 20 多种图表和十几种组件,并且支持各种图表以及组件的任意组合。强劲的渲染引擎Canvas、SVG 双引擎一键切换,增量渲染、流加载等技术实现千万级数据的流畅交互。专业的数据分析通过数据集管理数据,支持数据过滤、聚类、回归,帮助实现同一份数据的多维度分析。优雅的可视化设计默认设计遵从可视化原则,支

Unite Shanghai 2019全日程曝光(建议收藏)_aikb6223的博客-程序员秘密

https://mp.weixin.qq.com/s/KvAyXpDhqWROtTX1Ol3a4Q5月10-12日,Unite Shanghai 2019即将在上海国际会议中心正式开幕。本次大会共设有Keynote主题演讲,四大技术专场,Unity教育峰会,Training Day开发者训练日,近40个丰富精彩的互动展位,以及一系列丰富的周边活动。大会信息时间:5...

Java解析JSON,按规则获取JSON节点内容_LemonSmile_的博客-程序员秘密

首先约定json表示节点的规则,如{ "data": { "req": [{ "node1": "value1", "node2": "value2" }, { "node3": "value3", "node4": "value4" }] }}要获取node2的值时,规则应该填写JSON.data.req[0].node2要获取node3...

切入点表达式(前置通知、后置通知、异常通知、环绕通知、最终通知)_永远的HelloWorld的博客-程序员秘密

切入点表达式(前置通知、后置通知、异常通知、环绕通知、最终通知)

随便推点

常见的网络连接名词----SFTP SSH TELNET Xshell Xftp MobaXterm (终于理清了)_安安csdn的博客-程序员秘密

文章目录SFTPSSHTELNETXshell 和 Xftp一个好用的xshell替代工具-MobaXtermSFTPsftp是Secure File Transfer Protocol的缩写,安全文件传送协议。SSHSSH是一种网络协议,用于计算机之间的加密登录。TELNETTelnet协议是TCP/IP协议族的其中之一,是Internet远程登录服务的标准协议和主要方式,常用于网页服务器的远程控制,可供使用者在本地主机运行远程主机上的工作。Xshell 和 XftpXshell是一个用于

每个成功的奥特曼背后都有一个默默挨打的小怪兽_陕南赤子_新浪博客_simudi的博客-程序员秘密

(一)“妈妈,妈妈,”小怪兽问,“我什么时候才能长大呢?”正做饭的怪兽妈妈和蔼地问:“干吗想长大呀,做妈妈的乖宝宝不好吗?”“长大了我就能让奥特曼打了。”小怪兽一脸的憧憬。(二)“妈妈,妈妈。”小怪兽兴奋地跑进屋,“我考上啦......”正做饭的怪兽妈妈穿着围裙迎出来:“你考上什么啦,儿子。”小怪兽满脸的幸福:“我考上‘替身演员...

石河子大学计算机专业录取分数线,石河子大学2018年各省及各专业录取分数线及最低录投档线【理科 文科】..._爱吃香菜的卷毛的博客-程序员秘密

人生就像攀岩,其实高考,只是我们奋力翻过的第一座山。等翻上山顶,你会发现,山的那边依旧有无数座山,等着你继续攀!2019年高考氛围越来越石河子大学浓,很多小伙伴关注石河子大学全国各省最低录取分数线,石河子大学最低投档线的相关信息。本文高考助手网小编整理了石河子大学录取分数线的相关信息,希望对于参加2019年的高考填报志愿其参考左右。奋斗在高考一线,埋头在书本之间,金榜题名只在弹指之间,愿你马到成功...

DataTable,List,Dictonary互转,筛选及相关写法_aiquan6271的博客-程序员秘密

1.创建自定义DataTable/// 创建自定义DataTable(一) 根据列名字符串数组,/// &lt;/summary&gt;/// &lt;param name="sList"&gt;列名字符串数组&lt;/param&gt;/// &lt;returns&gt;DataTable&lt;/returns&gt;public static Dat...

Java:泛型_aysk1112的博客-程序员秘密

一、泛型的简单介绍1. 泛型的引入 JDK 1.5中引入了泛型这个新特性,泛型的本质是参数化类型(Parameterized Types)的应用,也就是指操作的数据类型被指定为一个参数,之后使用到该数据时必须符合指定的类型。这种参数化类型可以在类、接口和方法中使用,分别称为泛型类、泛型接口和泛型方法。2. 为什么引入泛型 泛型思想在C++模板(T...

**Java面试之虚拟机_vthinkwen的博客-程序员秘密

常见问题:介绍下 Java 内存区域(运行时数据区)Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)对象的访问定位的两种方式(句柄和直接指针两种方式)拓展问题:String类和常量池8种基本类型的包装类和常量池如何判断对象是否死亡(两种方法)。简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。如何...

推荐文章

热门文章

相关标签