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基础今日竟然暴打自己了。