2010-07-22 44 views
8

是否可以更新SimpleAdapter?我有一个数据列表和一个页脚,上面写着“查看下一个结果”当单击该列表项时,我捕获该事件并获取新数据。然后我想用这个新数据替换ListView中的数据,但我无法弄清楚如何去做。有任何想法吗?我不想使用ArrayAdapter,因为据我所见,项目只能容纳一个字符串,我需要它来容纳多个字符串和整数。如何在Android中更新SimpleAdapter

回答

10

更新:根据del116,你确实可以给SimpleAdapter一个可变的地图,然后手动调用适配器的notifyDataSetChanged方法,当你需要的名单进行更新。但是,我的观点是关于SimpleAdapter的文档,指定它是用于静态数据;将其用于可变数据与其设计相反,所以如果您使用这种技术,我将确保在出现新的Android版本时继续使用它。

(原文评论如下:)

如果你看看SimpleAdapter description它说,这是“一个简单的适配器映射静态数据在一个XML文件中定义的看法。”我已经添加了重点 - 简单地说,SimpleAdapater不是为了与更改的数据一起使用而构建的;它只处理静态数据。如果因为您的数据不止一位文本而无法使用ArrayAdapter,那么您将必须构建自己的自定义ListAdapter,或将数据放入数据库并使用其中一个CursorAdapter s。

作为最后的手段,如果你并不需要太多的表现,你可以通过建立一个全新的SimpleAdapter实例的任何时候你的数据的变化,并告诉通过使用它的列表视图更新由SimpleAdapter支持的ListViewsetListAdapter

+4

这里的答案真的很具误导性。更新数组数据并在我的SimpleAdapter上调用notifyDataSetChanged()之后,我能够更新simpleAdapter。不需要使用ArrayAdapter来调用notifyDataSetChanged()。 – dell116 2011-03-16 19:19:54

+1

@ dell116够公平的。我在回答结束时提到了这种可能性,但根据您的反馈,我已将其提升到最高水平,事实上它确实有效;我没有测试过它。我仍然认为做这样的事情值得注意,因为SimpleAdapter文档明确指出它是用于静态数据的。 – 2011-03-19 09:19:38

+0

现在回头看...哇。我对编程或SimpleAdapter的预期目的一无所知。如果您使用的ListView(或任何AdapterView)支持的数据结构将更改不使用SimpleAdapter。 Foot.inMouth(真); – dell116 2018-01-17 23:28:24

2

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

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。请记住,你必须用新数据更新的列表变量..

希望这有助于.. :)

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); 
-2
mySimpleAdapter.notifyDataSetChanged(); 

使用该行更新后数据中的数据HashMap地图列表

+0

请阅读文档,如上所述SimpleAdapter上不可行SimpleAdapter不适用于此类操作。 – Manny265 2016-07-05 19:09:44