为什么android子线程更新数据再调用notifyDataSetChanged没有效果
巴扎黑
巴扎黑 2017-04-17 16:27:31
[Android讨论组]

第一种可以更新

@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();
}
巴扎黑
巴扎黑

全部回复(3)
巴扎黑

其实一楼已经说得很清楚了。
刚好有点时间,画两张图吧..有点丑,别见怪

图一是第一种方法的模型,你addAll方法执行是在原list object上的,adapter指向的也是这个对象,所以notifydatasetchanged有效。

方法二里,你直接把AllCities指向了另一个list object,而adapter中所指向的还是原list,数据并没有变,所以无效。
另外可以不用handler,runOnUiThread方法已经将其封装好了,直接在Runnable中用就行。

阿神

你第二种中mAllCities已经有了新的引用,跟你原来绑定adapter的mAllCities没有了关系 所以你只是更新了mAllCities的新指向,却没有改变adapter绑定的那个mAllCities

PHP中文网

因为你第二种你把mAllCities.addAll(tempAllCities);去掉了,数据就没有发生变化,那么adapter中的数据当然也没有发生变化,何来更新??

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号