美文网首页
ListView notifyDataSetChanged()不

ListView notifyDataSetChanged()不

作者: 子非鱼7868 | 来源:发表于2019-05-09 17:43 被阅读0次

    今天在写项目的时候遇到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<String> set = new HashSet<String>(labels);
                    List<String> tempLists = new ArrayList<>(set);
                    labels = tempLabels;
    

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

    改成:

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

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

    相关文章

      网友评论

          本文标题:ListView notifyDataSetChanged()不

          本文链接:https://www.haomeiwen.com/subject/ilhgoqtx.html