如何在安卓中更新SimpleAdapter

9

有没有可能更新一个SimpleAdapter?我有一组数据和一个页尾,上面写着“查看下一页结果”。当列表项被点击时,我会捕获事件并获取新数据。然后,我希望使用这些新数据替换ListView中的旧数据,但我不知道该怎么做。有什么想法吗?我不想使用ArrayAdapter,因为据我所知,该适配器仅能包含一个字符串,而我需要它来包含多个字符串和整数。

4个回答

11
< p >更新:根据del116的说法,您确实可以给 SimpleAdapter 一个可变映射,然后在需要更新列表时手动调用适配器的notifyDataSetChanged方法。 但是,我下面的观点仍然有效,即SimpleAdapter的文档指定它仅用于静态数据;将其用于可变数据与其设计相悖,因此,如果您使用此技术,请务必检查是否仍然适用于新的Android版本。

(原始评论如下)

如果您查看SimpleAdapter说明,它表示“一种易于将静态数据映射到在XML文件中定义的视图的适配器。” 我已经强调了这一点--简单地说,SimpleAdapater不适用于更改的数据;它仅处理静态数据。 如果您不能使用ArrayAdapter,因为您的数据有多个文本位,则必须构建自己的自定义ListAdapter或将数据放在DB中并使用其中之一CursorAdapter

作为最后的手段,如果您不需要太多的性能,在数据更改时,您可以通过构建一个全新的SimpleAdapter实例并通过setListAdapter告诉列表视图使用它来更新由SimpleAdapter支持的ListView


4
你的回答实际上含糊不清。在更新数组数据并在SimpleAdapter上调用notifyDataSetChanged()后,我才能够更新SimpleAdapter。不需要使用ArrayAdapter来调用notifyDataSetChanged()。 - dell116
1
@dell116 好的。我在回答结束时提到了这种可能性,但根据您的反馈,我已经将其提升到了顶部,因为它确实可以工作;我之前没有测试过。我仍然认为这样做需要谨慎,因为SimpleAdapter文档明确指出它适用于静态数据。 - Walter Mundt
回顾这个现在...哇。我当时对编程或SimpleAdapter的预期目的一无所知。如果正在使用由将更改的数据结构支持的ListView(或任何AdapterView),请勿使用SimpleAdapter。Foot.inMouth(true); - dell116

3
ListView lv= (ListView) findViewById(R.id.loglist);
ArrayList<Map<String, String>> list = buildData();
String[] from = { "time", "message" };
int[] to = { R.id.logtime, R.id.logmessage };

adapter = new SimpleAdapter(getApplicationContext(), list,R.layout.log_list_row, from,to);
lv.setAdapter(adapter);

每次更新ListView时,调用此函数。记住,您必须使用新数据更新list变量。

希望这可以帮助你..:)


2

SimpleAdapter 是用于静态数据的,因此您的性能可能会有所不同。最好的解决方案可能是切换到其他类型的适配器,如 ArrayAdapter,或在每次更改数据集时创建一个新的 SimpleAdapter


0

我无法让notifyDataSetChanged()在更新我的SimpleAdapter时起作用,因此我尝试首先使用removeAllViews()删除附加到父布局的所有视图,然后添加ListView,这样就可以更新UI:

LinearLayout results = (LinearLayout)findViewById(R.id.results);
ListView lv = new ListView(this);
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
SimpleAdapter adapter = new SimpleAdapter( this, list, R.layout.directory_row, 
                    new String[] { "name", "dept" }, new int[] { R.id.name, R.id.dept } );

for (...) { 
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("name", name);
    map.put("dept", dept);
    list.add(map);
}

lv.setAdapter(adapter);
results.removeAllViews();     
results.addView(lv);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接