Android:如何刷新ListView内容?

ab1*_*b11 38 android listview android-adapter

ListView正在使用扩展名BaseAdapter,我无法正确刷新它.当我刷新时,似乎旧数据在新数据之上绘制,直到滚动事件发生.旧行绘制在新行的顶部,但是当我开始滚动时,旧行会消失.

我已经打过电话invalidateViews(),notifyDataSetChanged()notifyDataSetInvalidated().我的代码看起来像:

private void updateData()
{
   List<DataItems> newList = getNewList();

   MyAdapter adapter = new MyAdapter(getContext());
   //my adapter holds an internal list of DataItems
   adapter.setList(newList);
   mList.setAdapter(adapter);
   adapter.notifyDataSetChanged();
   mList.invalidateViews();
}
Run Code Online (Sandbox Code Playgroud)

Lon*_*uck 59

对于那些仍有问题的人,我这样解决了:

List<Item> newItems = databaseHandler.getItems();
ListArrayAdapter.clear();
ListArrayAdapter.addAll(newItems);
ListArrayAdapter.notifyDataSetChanged();
databaseHandler.close();
Run Code Online (Sandbox Code Playgroud)

我首先从适配器中清除了数据,然后添加了新的项目集合,然后才设置notifyDataSetChanged(); 这对我来说一开始并不清楚,所以我想指出这一点.请注意,不调用notifyDataSetChanged()视图将不会更新.

  • 什么是`dbh`? (3认同)

khc*_*tro 12

在我的理解,如果你想在数据已经改变立即刷新的ListView,你应该叫notifyDataSetChanged()RunOnUiThread().

private void updateData() {
    List<Data> newData = getYourNewData();
    mAdapter.setList(yourNewList);

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
                mAdapter.notifyDataSetChanged();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


Gub*_*bel 11

您不必创建新的适配器来更新ListView的内容.只需将您的适配器存储在一个字段中,并使用以下代码更新您的列表:

mAdapter.setList(yourNewList);
mAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

为了澄清这一点,您的活动应该如下:

private YourAdapter mAdapter;

protected void onCreate(...) {

    ...

    mAdapter = new YourAdapter(this);
    setListAdapter(mAdapter);

    updateData();
}

private void updateData() {
    List<Data> newData = getYourNewData();
    mAdapter.setList(yourNewList);
    mAdapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)