是否可以更新SimpleAdapter?我有一个数据列表和一个显示“查看下一个结果”的页脚当单击该列表项时,我捕获事件并获取新数据。然后我想用这个新数据替换ListView中的数据,但我无法弄清楚如何做到这一点。有任何想法吗?我不想使用ArrayAdapter,因为据我所知,这些项只能容纳一个字符串,我需要它来保存多个字符串和整数。
答案 0 :(得分:11)
更新:根据del116,您确实可以为SimpleAdapter
提供一个可变映射,然后在需要更新列表时手动调用适配器的notifyDataSetChanged
方法。但是,我的观点是关于SimpleAdapter的文档,指出它是针对静态数据的;将它用于可变数据与其设计背道而驰,因此如果您使用这种技术,我一定会检查它是否会在新的Android版本中继续发挥作用。
(原始评论如下:)
如果你看一下SimpleAdapter description,它说它是“将静态数据映射到XML文件中定义的视图的简单适配器。”我已经添加了重点 - 简而言之,SimpleAdapater
并非构建用于更改的数据;它只处理静态数据。如果您无法使用ArrayAdapter,因为您的数据包含多个文本,那么您将需要构建自己的自定义ListAdapter,或者将数据放入数据库并使用一个CursorAdapter s。
作为最后的手段,如果您不需要太多性能,可以通过构建全新的{{1}来更新由ListView
支持的SimpleAdapter
}实例,只要您的数据发生变化,并通过SimpleAdapter
告诉列表视图使用它。
答案 1 :(得分: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 :(得分:2)
SimpleAdapter
适用于静态数据,因此您的效果可能会有所不同。最好的解决方案可能是切换到不同类型的适配器,例如ArrayAdapter
,或者每次更改数据集时都创建一个新的SimpleAdapter
。
答案 3 :(得分:0)
我无法使用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);
答案 4 :(得分:-3)
mySimpleAdapter.notifyDataSetChanged();
在更新数据HashMap列表
中的数据后使用此行