如何刷新Android的ListView?

如何在添加/删除动态数据后刷新Android ListView


一旦您修改了该适配器中的数据,就可以在您的Adapter对象上调用notifyDataSetChanged()

关于如何/何时调用notifyDataSetChanged()一些额外细节可以在此Google I / O视频中查看。


你也可以使用这个:

myListView.invalidateViews();

请享用!


请忽略所有invalidate()invalidateViews()requestLayout() ,......这个问题的答案。

正确的做法(幸运地也被标记为正确的答案)是在你的适配器上调用notifyDataSetChanged()

故障排除

如果调用notifyDataSetChanged()不起作用,所有的布局方法都不会有帮助。 相信我ListView已被正确更新。 如果您无法找到差异,则需要检查适配器中的数据来自何处。

如果这只是您保存在内存中的集合,请在调用notifyDataSetChanged()之前检查是否实际删除了项目或将项目添加到了集合中。

如果您正在使用数据库或服务后端,则必须在调用notifyDataSetChanged()之前调用该方法来再次检索信息(或处理内存数据notifyDataSetChanged()

事情是这个notifyDataSetChanged只适用于数据集已经改变。 所以如果你没有发现变化,那就是你要看的地方。 如果需要调试。

ArrayAdapter vs BaseAdapter

我确实发现使用可以让你管理集合的适配器工作,就像BaseAdapter一样,效果更好。 像ArrayAdapter这样的适配器已经管理好自己的集合,这使得难以获得适当的更新集合。 在大多数情况下,这只是一个不必要的额外困难。

UI线程

确实,这必须从UI线程中调用。 其他答案有如何实现这一目标的例子。 但是,只有在您从UI线程之外处理这些信息时才需要。 这是来自服务或非UI线程。 在简单情况下,您将通过点击按钮或其他活动/片段来更新数据。 所以仍然在UI线程内。 不需要总是弹出runOnUiTrhead进来。

快速示例项目

可以在https://github.com/hanscappelle/so-2250770.git找到。 只需克隆并在Android Studio(gradle)中打开该项目即可。 这个项目有一个MainAcitivity构建一个包含所有随机数据的ListView 。 该列表可以使用操作菜单进行刷新。

我为这个示例ModelObject创建的适配器实现公开了数据收集

public class MyListAdapter extends BaseAdapter {

    /**
     * this is our own collection of data, can be anything we 
     * want it to be as long as we get the abstract methods 
     * implemented using this data and work on this data 
     * (see getter) you should be fine
     */
    private List<ModelObject> mData;

    /**
     * our ctor for this adapter, we'll accept all the things 
     * we need here
     *
     * @param mData
     */
    public MyListAdapter(final Context context, final List<ModelObject> mData) {
        this.mData = mData;
        this.mContext = context;
    }

    public List<ModelObject> getData() {
        return mData;
    }

    // implement all abstract methods here
}

来自MainActivity的代码

public class MainActivity extends Activity {

    private MyListAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView list = (ListView) findViewById(R.id.list);

        // create some dummy data here
        List<ModelObject> objects = getRandomData();
        // and put it into an adapter for the list
        mAdapter = new MyListAdapter(this, objects);
        list.setAdapter(mAdapter);

        // mAdapter is available in the helper methods below and the 
        // data will be updated based on action menu interactions

        // you could also keep the reference to the android ListView 
        // object instead and use the {@link ListView#getAdapter()} 
        // method instead. However you would have to cast that adapter 
        // to your own instance every time
    }

    /**
     * helper to show what happens when all data is new
     */
    private void reloadAllData(){
        // get new modified random data
        List<ModelObject> objects = getRandomData();
        // update data in our adapter
        mAdapter.getData().clear();
        mAdapter.getData().addAll(objects);
        // fire the event
        mAdapter.notifyDataSetChanged();
    }

    /**
     * helper to show how only changing properties of data 
     * elements also works
     */
    private void scrambleChecked(){
        Random random = new Random();
        // update data in our adapter, iterate all objects and 
        // resetting the checked option
        for( ModelObject mo : mAdapter.getData()) {
            mo.setChecked(random.nextBoolean());
        }
        // fire the event
        mAdapter.notifyDataSetChanged();
    }
}

更多信息

另一个关于listViews的力量的好帖子可以在这里找到:http://www.vogella.com/articles/AndroidListView/article.html

链接地址: http://www.djcxy.com/p/67335.html

上一篇: How to refresh Android listview?

下一篇: Repetition of image while scrolling in Android grid view using Universal Image Loader