notifyDataSetChanged示例

Tim*_*ima 160 android android-arrayadapter notifydatasetchanged

我正在尝试使用我Android ApplicationnotifyDataSetChanged()方法,ArrayAdapter但它对我不起作用.

我在这里找到答案,notifyDataSetChanged()应该在主线程中运行,但是没有例子.

任何人都可以发送一个例子或至少一个链接?!

jno*_*sek 321

对于ArrayAdapter,notifyDataSetChanged只有当你使用的作品add(),insert(),remove(),和clear()在适配器.

ArrayAdapter构造一个时,它保存List传入的引用.如果你传入一个List属于Activity的成员,并在稍后更改该Activity成员,ArrayAdapter则仍然保持对原始的引用List.适配器不知道您List在活动中更改了.

你的选择是:

  1. 使用的功能ArrayAdapter修改底层列表(add(),insert(),remove(),clear(),等等)
  2. ArrayAdapter使用新List数据重新创建.(使用大量资源和垃圾收集.)
  3. 创建自己的类衍生BaseAdapterListAdapter允许潜在的变化List数据结构.
  4. notifyDataSetChanged()每次更新列表时使用.要调用它的UI线程,使用runOnUiThread()Activity.然后,notifyDataSetChanged()会工作.

  • 也要小心,为数据分配"新"对象.使用clear()代替,重新填充/更改数据,然后调用notifyDataSetChanged() (13认同)
  • 我使用BaseExpandableListAdapter,它没有add()或remove()函数,因此我将Map存储为成员变量.我更新Map并调用notifyDatasetChanged()但没有任何反应.当我使用#4选项时,它可以工作.为什么??? (2认同)

Bri*_*ian 32

您可以使用以下runOnUiThread()方法.如果你没有使用a ListActivity,只需调整代码以获得对你的引用ArrayAdapter.

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});
Run Code Online (Sandbox Code Playgroud)


Ari*_*eem 11

我最近写过这个主题,虽然这篇文章很老,但我认为对于想要知道如何BaseAdapter.notifyDataSetChanged()一步一步地以正确方式实施的人会有所帮助.

请按照如何在Android中正确实现BaseAdapter.notifyDataSetChanged()更新的博客BaseAdapter.notifyDataSetChanged().


Kev*_*ker 6

我遇到了同样的问题,我不想连续用新的实例替换整个ArrayAdapter.因此,我让AdapterHelper在其他地方进行繁重的工作.

将此添加到您通常(尝试)调用notify的位置

new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

AdapterHelper类

public class AdapterHelper {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
        arrayAdapter.clear();
        for (Object object : listOfObject){
            arrayAdapter.add(object);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在Java中,函数称为方法.您会提出什么建议,将这种高度可重用的方法与阵列适配器放在同一个类中?或包含列表视图的片段/活动?所以是的,它在一个可以重复使用的类中.如果你想通过任何方式使其静止继续. (2认同)