【发布时间】:2011-03-19 19:21:18
【问题描述】:
是否可以更新 SimpleAdapter?我有一个数据列表和一个显示“查看下一个结果”的页脚,当单击该列表项时,我会捕获事件并获取新数据。然后我想用这个新数据替换 ListView 中的数据,但我不知道该怎么做。有任何想法吗?我不想使用 ArrayAdapter,因为据我所知,这些项目只能容纳一个字符串,而我需要它来容纳多个字符串和整数。
【问题讨论】:
标签: android listview listadapter
是否可以更新 SimpleAdapter?我有一个数据列表和一个显示“查看下一个结果”的页脚,当单击该列表项时,我会捕获事件并获取新数据。然后我想用这个新数据替换 ListView 中的数据,但我不知道该怎么做。有任何想法吗?我不想使用 ArrayAdapter,因为据我所知,这些项目只能容纳一个字符串,而我需要它来容纳多个字符串和整数。
【问题讨论】:
标签: android listview listadapter
更新:根据del116,确实可以给SimpleAdapter一个可变映射,然后在需要更新列表时手动调用适配器的notifyDataSetChanged方法。但是,我的以下观点是关于 SimpleAdapter 的文档,该文档指定它用于静态数据;将它用于可变数据与它的设计背道而驰,所以如果你使用这种技术,我一定会检查它是否在新的 Android 版本出现时继续工作。
(原文如下:)
如果您查看SimpleAdapter description,它会说它是“将 静态数据 映射到 XML 文件中定义的视图的简单适配器。”我已经添加了重点——简单地说,SimpleAdapater 不是为使用变化的数据而构建的;它只处理静态数据。如果您不能使用ArrayAdapter,因为您的数据包含不止一位文本,那么您将不得不构建自己的自定义ListAdapter,或者将您的数据放入数据库并使用@987654324 之一@s.
作为最后的手段,如果您不需要太多性能,您可以更新由SimpleAdapter 支持的ListView,方法是在您的数据任何时候构建一个全新的SimpleAdapter 实例更改并通过setListAdapter 告诉列表视图使用它。
【讨论】:
SimpleAdapter 用于静态数据,因此您的性能可能会有所不同。最好的解决方案可能是切换到不同类型的适配器,例如ArrayAdapter,或者每次更改数据集时都创建一个新的SimpleAdapter。
【讨论】:
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 变量..
希望对您有所帮助..:)
【讨论】:
我无法让 notifyDataSetChanged() 来更新我的 SimpleAdapter,因此我尝试首先使用 removeAllViews() 删除所有附加到父布局的视图,然后添加 ListView,这很有效,让我更新用户界面:
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);
【讨论】: