ListView notifyDataSetChanged()不刷新

今天在写项目的时候遇到notifyDataSetChanged()不刷新的情况,一个很小的错误,记录一下
背景:
扫描枪每一次扫描结束后,我需要将扫描到的单号记录下来放到一个listView中显示,

2.png
每次扫描后都需要更新listView(用观察者来监听数据源的变动)
1.png

一开始的实现就是截图的代码,是可以实现需求的,但是为了避免重复扫码(如果按照上面的代码,重复的单号一样会被计入到list然后显示).为了避免这个问题,我对存放单号的list做了去重处理(用的Set):
3.png
好了问题出现了,在扫描第一个是正常的,但是第二个就有问题了
出现问题的原因分析:
1. Set去重出现问题
打印了Set去重后的数组,发现这一步是没有问题的
2. ListView没有刷新
4.png

打了断点发现mAdapter.notifyDataSetChanged()是走了的,而且mAdapter的getCount也是走了的,说明ListView已经刷新了,那么就是

问题: 为什么不去重就可以刷新,去重了就不能刷新?
断点显示ListView已经刷新了,那么问题就出现在数据源上

但是这个mLabels是我直接传过来的,数据也是对的,数据的传递过程中没有做过任何处理,那么只能是在数据去重的地方出问题了,看了下去重的代码:

                labels.add(scanResult);
                //去重
                Set set = new HashSet(labels);
                List tempLists = new ArrayList<>(set);
                labels = tempLabels;

因为List tempLists = new ArrayList<>(set)重新开辟了内存地址,猜测是这个原因导致的

改成:

                 labels.add(scanResult);
                //去重
                 Set set = new HashSet(labels);
                 List tempLists = new ArrayList<>(set);
                 labels.clear();
                 labels.addAll(tempLists);

问题解决
错误产生的原因:
List tempLists = new ArrayList<>(set)这句代码重新开辟了内存地址,然后 labels = tempLabels将labels的指针指向了这个新的地址,所以此labels非彼labels,而mAdapter.notifyDataSetChanged()刷新的数据源还是原来的地址所以不刷新

你可能感兴趣的:(ListView notifyDataSetChanged()不刷新)