前段時間在做一個動態刷新ListView(模擬聊天),遇到一個問題,調用notifyDataSetChanged()方法,數據源已經存在但是並沒有動態刷新! 首先我們需要瞭解notifyDataSetChanged方法 它是通過一個外部的方法控制如果適配器的內容改變時需要強制調用getView來刷新 ...
前段時間在做一個動態刷新ListView(模擬聊天),遇到一個問題,調用notifyDataSetChanged()方法,數據源已經存在但是並沒有動態刷新!
首先我們需要瞭解notifyDataSetChanged方法
它是通過一個外部的方法控制如果適配器的內容改變時需要強制調用getView來刷新每個Item的內容,可以實現動態的刷新列表的功能。
但是他其中有一個細節,需要註意,我的ListView使用的數據源是來自ArrayList。
當發送消息時我們聲明一個
ArrayList<String> list1 =new ArrayList<String>();
list1.add("我發送了一個消息")
adapter.notifyDataSetChanged();
當接收消息時我們又聲明一個
ArrayList<String> list2 =new ArrayList<String>();
list2.add("您收到一條消息");
adapter.notifyDataSetChanged();
雖然我們在每個方法底部調用notifyDataSetChanged();但是無刷新!
在這個時候list1和list2指向不同的堆記憶體,在方法底部調用notifyDataSetChanged()方法就不起作用了!這時的list已經不是原來的list了。所以它無法推斷,更不能做出響應。
但是我們有另外一個辦法就是handler
接下來就是解決問題的時候!!!!!!!!!
將發送方法更改一小下
ArrayList<String> list1 =new ArrayList<String>();
list1.add("我發送了一個消息");
handler.sendEmptyMessage(3);
接收的方法
ArrayList<String> list2 =new ArrayList<String>();
list2.add("您收到一條消息");
handler.sendEmptyMessage(3);
我們將刷新數據的方法寫在Hadler中,即可解決我們的問題
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg){
int what=msg.what;
switch(what){
case 3:
adapter.notifyDataSetChanged();
break;
default :
break;
}
}
}