• 【Android中RecyclerView刷新导致源数据被刷新】


    需求

    有一个级联弹窗,长这样的,只点击左边,外部取消弹窗,不更改原选中项。
    在这里插入图片描述

    其实,这也没什么难的,主要是调试时出现了一次又一次不符合需求,即点击左边列表时,发生了更改源数据,但是我明明只改变了列表中数据的状态。

    于是,多轮调试后,我想了java基础,直接赋值得到的list中元素如果是相同,即内存地址也一致。
    那么,我直接把数据抛进适配器,当列表项刷新时,就修改列列表项,但是内存地址不变。因此
    当我刷新左边列表后,在弹窗外部取消弹窗,重新打开列表项,选中的位置就不是正确位置。

    验证List元素相同方法

    1.创建Bean

    public class User {
        int age;
        String name;
    
        public User(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2.test相同元素

        @Test
        public void testListAddress1() {
            List<User> l1 = new ArrayList<>();
            List<User> l2 = new ArrayList<>();
            for (int i = 0; i< 5; i++) {
                l1.add(new User(i, "d"));
            }
            l2 = l1;
            List<User> l3 = l1;
            System.out.println(l1);
            System.out.println(l2);
            System.out.println(l3);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出相同的元素

    [main.com.*.model.User@2b71fc7e, 
     main.com.*.model.User@5ce65a89,
     main.com.*.model.User@25f38edc,
     main.com.*.model.User@1a86f2f1, 
     main.com.*.model.User@3eb07fd3]
    
    [main.com.*.model.User@2b71fc7e,
     main.com.*.model.User@5ce65a89,
     main.com.*.model.User@25f38edc,
     main.com.*.model.User@1a86f2f1,
     main.com.*.model.User@3eb07fd3]
    
    [main.com.*.model.User@2b71fc7e,
     main.com.*.model.User@5ce65a89, 
     main.com.*.model.User@25f38edc,
     main.com.*.model.User@1a86f2f1, 
     main.com.*.model.User@3eb07fd3]
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.test 测试不同元素

    测试源码

        @Test
        public void testListAddress2() {
            List<User> l1 = new ArrayList<>();
            List<User> l2 = new ArrayList<>();
            for (int i = 0; i< 5; i++) {
                l1.add(new User(i, "d"));
            }
            l2 = l1;
            List<User> l3 = new ArrayList();
            for (User user : l1) {
                l3.add(new User(user.getAge(), user.getName()));
            }
            System.out.println(l1);
            System.out.println(l2);
            System.out.println(l3);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    输出

    [main.com.*.model.User@2b71fc7e,
     main.com.*.model.User@5ce65a89, 
     main.com.*.model.User@25f38edc,
     main.com.*.model.User@1a86f2f1,
     main.com.*.model.User@3eb07fd3]
       
    [main.com.*.model.User@2b71fc7e,
     main.com.*.model.User@5ce65a89,
     main.com.*.model.User@25f38edc,
     main.com.*.model.User@1a86f2f1,
     main.com.*.model.User@3eb07fd3]
        
    [main.com.*.model.User@506c589e,
     main.com.*.model.User@69d0a921,
     main.com.*.model.User@446cdf90,
     main.com.*.model.User@799f7e29,
     main.com.*.model.User@4b85612c]
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4.总结

    如果不想List里面的元素相同,列表复制时需要新建对象,将源对象的属性复制到新对象。

    分析验证到这里,改下代码,问题解决了。

    感慨,遗忘了的Java基础今日竟然暴打自己了。

  • 相关阅读:
    MySQL主从配置的一些问题
    这些不知道,别说你熟悉 Nacos,深度源码解析!
    shell脚本的基础知识
    【黑马云盘 Debug】ASSERT: “i >= 0 && i < size()“
    LED驱动IC:HC2160,内置60V功率MOS升压型LED恒流驱动IC。供应LED灯杯单节电池以上供电的LED灯串平板显示LED背光大功率LED照明
    中职网络安全竞赛设备-----文件上传渗透测试
    PIP安装
    AI编程工具合集整理优缺点
    Python开发工具PyCharm全新版本V2022.2正式发布——支持 Python 3.11
    用Java计算100元兑换10元,5元,1元纸币的方法
  • 原文地址:https://blog.csdn.net/niceboye/article/details/127792363