天天看點

android深度了解ListView notifyDataSetChanged()不重新整理

        首先說一下大家遇到的問題:

/**
 * Created by LH on 2016/8/27.
 */
public class Test {
    private List<String> A,B;
    private ListView lv;
    private void test(){
        A=new ArrayList<String>();
        B=new ArrayList<String>();
        A.add("hello");
        A.add("hi");
        B.add("how are you");
        B.add("hello world");
        MyAdapter adapter=new MyAdapter(this,A);
        lv.setAdapter(adapter);
        A=B;
        adapter.notifyDataSetChanged();
    }
}
           

        遇到以上的問題很多人都會感到很奇怪ListView就是不重新整理。首先是因為Java語言的封裝性比較好。幫我們完成了很多工作,這也導緻了很多人都不太了解指針的概念。如果大家真的還是不太了解建議大家去初步學習一下C語言。其實不重新整理的根本原因是List的記憶體位址發生了改變。 

android深度了解ListView notifyDataSetChanged()不重新整理
android深度了解ListView notifyDataSetChanged()不重新整理

        如圖所示List的指針位置由A的開始位置移動到了B的開始位置。而notifyDataSetChanged()隻是重新整理ListView,資料還是會從原來的起始位址開始查找。原來的位置的資料沒有改變,隻有在List的内容或者長度發生改變時才會重新整理,是以ListView沒有重新整理。如果是ListView的内容發生改變如下圖:

android深度了解ListView notifyDataSetChanged()不重新整理
android深度了解ListView notifyDataSetChanged()不重新整理

        因為指針的起始位置并不會随着List的改變而改變是以notifyDataSetChanged()時依然能夠找到原來的位置,是以能夠重新整理ListView。

        如果讀者想用開始時代碼的方式整體給A集合重新指派。那麼可以通過下面的方式:

A.clear();
        A.addAll(B);
        adapter.notifyDataSetChanged();
           

        這樣隻是給A結合中的所有内容重新指派指針并沒有改變是以通過 notifyDataSetChanged()能重新整理。

繼續閱讀