Android中Adapter的notifyDataSetInvalidated()和notifyDataSetChanged()的區別

notifyDataSetChanged方法通過一個外部的方法控制如果適配器的內容改變時需要強制調用getView來刷新每個Item的內容。

public void notifyDataSetChanged ()

該方法內部實現了在每個觀察者上面調用onChanged事件。每當發現數據集有改變的情況,或者讀取到數據的新狀態時,就會調用此方法。

public void notifyDataSetInvalidated ()

該方法內部實現了在每個觀察者上面調用onInvalidated事件。每當發現數據集監控有改變的情況,比如該數據集不再有效,就會調用此方法。

今天用到Listview刷新功能,之前解決都是給Listview重新負上adapter這樣listview就滾動到第一條了,但是這樣會有些耗內存,程序寫法也不美觀。理論上是這樣的,需要實驗一下,重要的是一下兩句話!
notifyDataSetInvalidated(),會重繪控件(還原到初始狀態)選項會跳轉到第一項
notifyDataSetChanged(),重繪當前可見區域,停留在當前選項

項目中不需要每次都刷新,所以採用notifyDataSetChanged()

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){
        systemSettingListView.setSelection(position);
        Fragment fragment = null; 
        if (position == NET_SEETING) { 
            fragment = new SystemSettingNetContentFragment();;
        } else if (position == ACCOUNT_SETTING) { 
            fragment = new SystemSettingAccountContentFragment();
        } else if (position == AUDIO_SETTING) { 
            fragment = new SystemSettingAudioContentFragment();
        } else if (position == VIDEO_SETTING) { 
            fragment = new SystemSettingVideoContentFragment();
        } else if (position == NET_UPDATE) { 
            fragment = new SystemSettingUpdateContentFragment();
        } else if (position == STATUS_FIND) { 
            fragment = new SystemSettingStatusContentFragment();

        } 
        adapter.setSelectItem(position);
        adapter.notifyDataSetChanged();
        getFragmentManager().beginTransaction()
        .replace(R.id.system_setting_right_fragment, fragment).commit(); 

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章