第一种可以更新
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_city_list);
initData();
initView();
getAllCities();
}
private void initData() {
dbManager = new DBManager(this);
dbManager.copyDBFile();
mCityAdapter = new CityListAdapter(CityPickerActivity.this, mAllCities);
}
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case COMPLETED:
mAllCities.addAll(tempAllCities);
mCityAdapter.notifyDataSetChanged();
break;
}
}
};
private void getAllCities() {
new Thread(new Runnable() {
@Override
public void run() {
tempAllCities = dbManager.getAllCities();
mHandler.sendEmptyMessage(COMPLETED);
}
}).start();
}
第二种,为什么没有效果
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_city_list);
initData();
initView();
getAllCities();
}
private void initData() {
dbManager = new DBManager(this);
dbManager.copyDBFile();
mCityAdapter = new CityListAdapter(CityPickerActivity.this, mAllCities);
}
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case COMPLETED:
mCityAdapter.notifyDataSetChanged();
break;
}
}
};
private void getAllCities() {
new Thread(new Runnable() {
@Override
public void run() {
mAllCities = dbManager.getAllCities();
mHandler.sendEmptyMessage(COMPLETED);
}
}).start();
}
你第二种中mAllCities已经有了新的引用,跟你原来绑定adapter的mAllCities没有了关系 所以你只是更新了mAllCities的新指向,却没有改变adapter绑定的那个mAllCities
因为你第二种你把mAllCities.addAll(tempAllCities);去掉了,数据就没有发生变化,那么adapter中的数据当然也没有发生变化,何来更新??
其实一楼已经说得很清楚了。
刚好有点时间,画两张图吧..有点丑,别见怪
图一是第一种方法的模型,你addAll方法执行是在原list object上的,adapter指向的也是这个对象,所以notifydatasetchanged有效。
方法二里,你直接把AllCities指向了另一个list object,而adapter中所指向的还是原list,数据并没有变,所以无效。
另外可以不用handler,runOnUiThread方法已经将其封装好了,直接在Runnable中用就行。