首页 > 为什么android子线程更新数据再调用notifyDataSetChanged没有效果

为什么android子线程更新数据再调用notifyDataSetChanged没有效果

第一种可以更新

@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中用就行。

【热门文章】
【热门文章】