ListViews - 如何在API 11之前使用ArrayAdapter.addAll()函数?

mat*_*boy 17 android android-listview

我正在尝试使用全新的ArrayList更新ListView.对于API 11,使用addAll(...)方法可以很好地工作,但是这不适用于早期的API.我无法弄清楚如何为旧版本更新这样的整个列表.

ArrayAdapter<String> textList = new ArrayAdapter<String>(listener, R.layout.list_item, stringList);
listener.setListAdapter(textList);
Run Code Online (Sandbox Code Playgroud)

然后......

textList.clear();
textList.addAll(stringList); <--- works fine for Android 3.0 (API Level 11) and beyond, but not before. 
Run Code Online (Sandbox Code Playgroud)

在API 11中引入addAll()之前,你是如何做到这一点的?谢谢.

Sea*_*eau 19

以下是使用SDK_INT> = 11的Android设备的原生addAll()的完整代码块,并对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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

@TargetApi(11)当您<uses-sdk android:minSdkVersion="X"/>在AndroidManifest.xml中有一个X小于11 时,注释与ADT 17一起用于抑制Lint警告.有关详细信息,请参阅http://tools.android.com/recent/lintapicheck.

  • 我添加了`setNotifyOnChange(false);`/`notifyDataSetChanged();`pair:如果你有数百个项目(在我的情况下约为800),这会显着提高性能(1500 ms vs <1 ms),这可以防止在每个`add()`之后调用`notifyDataSetChanged()`. (2认同)

yor*_*rkw 11

最简单的方法是避免在循环中使用ArrayAdapter.addAll()和ArrayAdapter.add(),就像他的回答中提到的idiottiger一样.

如果你坚持使用ArrayAdapter.addAll(),简短的回答就是DIY.在这里查看android.widget.ArrayAdapter的来源,实际的实现比你想象的要简单得多.有很多替代方法可以实现这一目标,例如:

  • 选项1:实现您自己的ArrayAdapter扩展android.widget.BaseAdapter,您可以完全控制私有实例变量和方法,并可以在您自己的实现中定义您想要的任何方法.互联网上有很多教程讲述了如何创建自定义适配器,就像这里这里一样.
  • 选项2:实现你自己的ArrayAdapter扩展android.widget.ArrayAdapter,然后将所需的公共方法addAll()添加到你自己的ArrayAdapter实现中,你没有android.widget.ArrayAdapter中私有成员的可见性所以需要使用现有的公共API ArrayAdapter.add()用于添加循环中的每个元素.

选项1是首选并且非常常用,尤其是在需要在ListView中呈现更复杂的自定义UI内容的情况下.

  • 这有些不相关,但是如果您使用Eclipse开发Android应用程序,请查看这篇文章:http://www.helloandroid.com/content/gold-android-developers-add-aosp-source-code-eclipse-android -sources-插件 (3认同)