作者: 專業收買佬 時間: 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().....
係唔係咁 ???

