【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;
    }
}

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);

    }

输出相同的元素

[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

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);

    }

输出

[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

4.总结

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值