我正在尝试用全新的ArrayList更新ListView。对于API11,它使用addAll(...)工作得很好方法,但这对于早期的API不可用。我不知道如何更新老版本的整个列表。
ArrayAdapter<String> textList = new ArrayAdapter<String>(listener, R.layout.list_item, stringList);
listener.setListAdapter(textList);后来..。
textList.clear();
textList.addAll(stringList); <--- works fine for Android 3.0 (API Level 11) and beyond, but not before. 在API11中引入addAll()之前,您是如何做到这一点的?谢谢。
发布于 2012-03-13 10:48:56
最简单的方法是避免在循环中使用ArrayAdapter.addAll()和ArrayAdapter.add(),就像idiottiger在他的回答中建议的那样。
如果您坚持使用ArrayAdapter.addAll(),简短的答案是自己动手做。查看android.widget.ArrayAdapter here的源代码,实际实现比您想象的要简单得多。有许多替代方案可以实现这一点,例如:
选项1是首选的,也是非常常用的,特别是在需要在ListView中呈现更复杂的自定义UI内容的情况下。
发布于 2012-09-07 22:48:44
下面是完整的代码块,它为安装了SDK_INT >= 11的安卓设备使用原生API (),并对API级别低于11的设备使用循环解决方案。
@TargetApi(11)
public void setData(List<String> data) {
clear();
if (data != null) {
//If the platform supports it, use addAll, otherwise add in loop
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
addAll(data);
} else {
for(String item: data) {
add(item);
}
}
}
}当X小于11的AndroidManifest.xml中有一个@TargetApi(11)时,ADT 17会使用Lint注释来抑制Lint警告。有关更多信息,请参阅http://tools.android.com/recent/lintapicheck。
发布于 2012-12-13 08:43:21
我结合了barbeau和Villarey的答案,我认为这是一个很好的解决方案:
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void setData(List<String> data) {
clear();
if (data != null) {
addAll(data);
}
}
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void addAll(String... items) {
//If the platform supports it, use addAll, otherwise add in loop
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
super.addAll(items);
}else{
for(String item: items){
super.add(item);
}
}
}https://stackoverflow.com/questions/9677172
复制相似问题