adapter.notifysetdatachanged() 唔識update....

用Arraylist做data source....
adapter.add(0, item);
之後adapter.notifysetdatachanged(();

如果開始時個Arraylist 係空的.....之後add(0, item), update無反應....

但Arraylist唔係空, 再 add(0, item)就正常...

用Arraylist做data source....
adapter.add(0, item);
之後adapter.notifysetdatachanged(();

如果開始時 ...
專業收買佬 發表於 2018-2-17 17:16


   
可以試下做曬additem()先至call setAdapter() 之後再call notifydatasetchanged

via HKEPC IR Pro v2.1.0 - Android

TOP

本帖最後由 Charcoal99 於 2018-2-18 23:03 編輯

你說的「空」應該是指 null 而不是沒有內容的空list。
adapter 應初始化到空list 而不是 null 或 null object.
https://developer.android.com/re ... t/ArrayAdapter.html
留意list參數T[] objects 一項 The value must never be null.

Adapter class 內建有一observer, 會追踨list內容的變化,notifydatasetchanged 通知其List內容發生變化,但List 的Reference 並不能變, 如果你的List開始時是null, 其後再設定, 那是List變成另一List而不是同一List內容的變化,notifydatasetchanged 並不追踨list ref 的變化,
如果一開始list沒有內容, 也要初始化其reference 為一固定的空List, e.g.
ArrayList list = new ArrayList(); 而不是指到null object.
因為你經adapter add item 到 null object裡它也不會自動為你創建新List而失敗。

TOP

本帖最後由 專業收買佬 於 2018-2-19 17:57 編輯
你說的「空」應該是指 null 而不是沒有內容的空list。
adapter 應初始化到空list 而不是 null 或 null obje ...
Charcoal99 發表於 2018-2-18 07:48


貼返D code出黎先....
    private ArrayList<String[]> lv_data_in = new ArrayList<>();
    private ArrayList<String[]> lv_data_stock = new ArrayList<>();
   

    private void init_in() {
        empty_listview = (LinearLayout) view_in.findViewById(R.id.llIdemptylistview);
        listview_in = (ListView) view_in.findViewById(R.id.lvIdGroup);
        adapter_in = new myListViewAdapter(lv_data_in, inflater, MainActivity.this);
        listview_in.setAdapter(adapter_in);
    }

private void init_stock() {
        listview_stock = (ListView) view_stock.findViewById(R.id.lvIdStock);
        adapter_stock = new myListViewAdapter(lv_data_stock, inflater, MainActivity.this);
        listview_stock.setAdapter(adapter_stock);
    }

prvate void data_incoming(){
// data operation.
......
if(xxx){
lv_data_stock.add(0, data)
adapter_stock.noticfydatasetchanged();          <~~~佢無反應.
}else{
lv_data_in.add(0, data)
adapter_in.noticfydatasetchanged();                  <~~~但呢個又好似正常.
}

感激回覆.....
兩個listview的處理無咩分別.....但check左幾次無咩特別唔同...

TOP

可以試下做曬additem()先至call setAdapter() 之後再call notifydatasetchanged

via HKEPC IR Pro ...
ylimny 發表於 2018-2-18 00:52



    個app要係網上dl data.先可以add落去....
data係有時效性....無得add定.

TOP

本帖最後由 專業收買佬 於 2018-2-20 15:45 編輯

試左好耐......個徵狀有D古怪.....

private ArrayList<String[]> lv_data_in = new ArrayList<>();
    private ArrayList<String[]> lv_data_stock = new ArrayList<>();
   

    private void init_in() {
        empty_listview = (LinearLayout) view_in.findViewById(R.id.llIdemptylistview);
        listview_in = (ListView) view_in.findViewById(R.id.lvIdGroup);
        adapter_in = new myListViewAdapter(lv_data_in, inflater, MainActivity.this);
        listview_in.setAdapter(adapter_in);
    }

private void init_stock() {
        listview_stock = (ListView) view_stock.findViewById(R.id.lvIdStock);
        adapter_stock = new myListViewAdapter(lv_data_stock, inflater, MainActivity.this);
        listview_stock.setAdapter(adapter_stock);
    }

prvate void data_incoming(){
// data operation.
......
if(xxx){
lv_data_stock.add(0, data)
adapter_stock.noticfydatasetchanged();          <~~~佢無反應...listview_stock.getAdapter.getCount() = 1;之後再add(0,data)入去都唔識show出黎.
}else{
lv_data_in.add(0, data)
adapter_in.noticfydatasetchanged();                  <~~~正常.
}

但如果lv_data_stock.add(0, lv_data_in.get(index));
再adapter_stock.notifydatatsetchanged()之後就會識show d data出黎....包括之前add果D....

一旦佢有野show出黎....就全部正常了....

諗唔到有D咩問題......求救.....

TOP

data_incoming() 是在其他 Thread/Task 裡跑的嗎?
如果是的話, adapter_stock.noticfyDataSetChanged() 要用 runOnUiThread() 來執行。

TOP

data_incoming() 是在其他 Thread/Task 裡跑的嗎?
如果是的話, adapter_stock.noticfyDataSetChanged() 要 ...
Charcoal99 發表於 2018-2-20 20:03



   no.....UI thread.....

TOP

唔肯定關唔關事,但可以睇睇 https://stackoverflow.com/questi ... asetchanged-example

佢話用 noticfyDataSetChanged() 的話,你應該用 adapter.add() 去加 data, 唔應該用 arrayList.add() 去做.

TOP

我自己做development 時都有遇過類似,但無時間無技術去深入研究
我自己一般做法係,pass list to adapter, adapter copies list reference to itself. 然後 adapter.list.add(), and notifyDatasetChange() 去update list ,未試過出問題

TOP