Board logo

標題: adapter.notifysetdatachanged() 唔識update.... [打印本頁]

作者: 專業收買佬    時間: 2018-2-17 17:16     標題: adapter.notifysetdatachanged() 唔識update....

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

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

但Arraylist唔係空, 再 add(0, item)就正常...
作者: ylimny    時間: 2018-2-18 00:52

用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
作者: Charcoal99    時間: 2018-2-18 07:48

本帖最後由 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而失敗。
作者: 專業收買佬    時間: 2018-2-19 14:29

本帖最後由 專業收買佬 於 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左幾次無咩特別唔同...
作者: 專業收買佬    時間: 2018-2-19 14:38

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

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



    個app要係網上dl data.先可以add落去....
data係有時效性....無得add定.
作者: 專業收買佬    時間: 2018-2-20 15:42

本帖最後由 專業收買佬 於 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咩問題......求救.....
作者: Charcoal99    時間: 2018-2-20 20:03

data_incoming() 是在其他 Thread/Task 裡跑的嗎?
如果是的話, adapter_stock.noticfyDataSetChanged() 要用 runOnUiThread() 來執行。
作者: 專業收買佬    時間: 2018-2-20 20:15

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



   no.....UI thread.....
作者: goofyz    時間: 2018-2-22 11:38

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

佢話用 noticfyDataSetChanged() 的話,你應該用 adapter.add() 去加 data, 唔應該用 arrayList.add() 去做.
作者: s.friday1004    時間: 2018-2-22 17:19

我自己做development 時都有遇過類似,但無時間無技術去深入研究
我自己一般做法係,pass list to adapter, adapter copies list reference to itself. 然後 adapter.list.add(), and notifyDatasetChange() 去update list ,未試過出問題
作者: 專業收買佬    時間: 2018-2-22 22:47

本帖最後由 專業收買佬 於 2018-2-23 01:17 編輯
我自己做development 時都有遇過類似,但無時間無技術去深入研究
我自己一般做法係,pass list to adapter, ...
s.friday1004 發表於 2018-2-22 17:19



    感謝....岩岩係度諗緊係咪要係adapter度寫返adapter.add(), adapter.remove(), adapter.modifield().....
睇完你的做法....如果我無理解錯GE....即係
public class myListViewAdapter extends BaseAdapter {
    private Context context;
    public ArrayList<String[]> order_data;
    private LayoutInflater inflater;

    static class ViewHolder{
    }


    public myListViewAdapter(ArrayList<String[]> data, LayoutInflater inflater, Context context){
        this.order_data = data;
        this.inflater = inflater;
        this.context = context;
    }


如果要add data時就
adapter.order_data.add(0, data);
之後再
adapter.notifydatasetchanged().....
係唔係咁 ???





歡迎光臨 電腦領域 HKEPC Hardware (https://h2.hkepc.com/forum/) Powered by Discuz! 7.2