adapter.notifyDataSetChanged()使用没有效果的解决办法。


最近写代码,遇到适配器的问题,就是写了listview,里面有个全选框,用来设置全选列表项的。然而,在点击之后,更改了属性后并没有更新列表。
网上查了一些方法,说是在刷新的时候由于列表内容缓存了之前的引用,所以导致加载的内容没有改变,导致了此方法的无效。

然而,自定义的列表,内容多而杂,又不好删掉重建一个(其实是不会)。后来了解到这个方法实际上会调用getView()这个方法,这个方法中,如果内容没有改变,此方法就不会刷新,那么我们在getView()里加上你更新操作的一些判断就可以了。如此就可以更改列表的内容。

刷新时一定要让getView()产生变化,才能刷新成功。

注:有时候初始化listview的时候,发现没有走getview方法,而导致什么都不显示是因为适配器会先执行getcount方法,如果返回0则不会执行getview方法。

方法一:试下重新setAdapter()。
方法二:notifyDataSetChanged()方法是重新调用adapter的getView,所以getView方法里的有变化,界面才会更新。检查下数据是否有变化,或者是否在getView中做了缓存判断什么的。

在第一次创建listView的时候,getView();有时候会执行多次,这是由于动态刷新listview中layout_height这个属性值导致的。多次执行可能会在你的代码中出现问题。比如我之前要对列表项做操作(假设有10条数据),然后将内容放到了map里面,然后再每次执行getview的时候将新的内容放入。本来在position=9之后就结束的,然而又从0开始执行。这样的循环次数不固定,有时多一点有时少一点。这让我放入map的数据产生了变化,之后的数据都被抹掉了。后来查阅后了解到,这是由于之前我们所说的height的数值不固定,导致了重复执行。
解决这个问题有两种方法:
一、将listview中layout_height这个属性写死,或者给固定数值,或者fill_parent match_parent。
二、

private void fixedListView(){  
            listView = (ListView) findViewById(R.id.listview);  
            ViewGroup.LayoutParams params = listView.getLayoutParams();    
            layout = (HorizontalScrollView) findViewById(R.id.layout);  
            params.height = layout.getHeight(); //需要设置的listview的高度,你可以设置成一个定值,也可以设置成其他容器的高度,如果是其他容器高度,那么不要在oncreate中执行,需要做延时处理,否则高度为0  
            listView.setLayoutParams(params);     
    }

这样就可以解决问题了