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

时间:2012-03-13 01:29:02

标签: android android-listview

我正在尝试使用全新的ArrayList更新ListView。对于API 11,使用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. 

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

8 个答案:

答案 0 :(得分:19)

以下是使用SDK_INT&gt; = 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);
            }
        }
    }
}

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

答案 1 :(得分:11)

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

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

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

选项1是首选并且非常常用,特别是在需要在ListView中呈现更复杂的自定义UI内容时。

答案 2 :(得分:4)

我将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);
        }
    }
}

答案 3 :(得分:3)

我在网上建立了其他人的代码,我创造了这个。只需在需要的地方使用此类而不是ArrayAdapter类。

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.widget.ArrayAdapter;

import java.util.Collection;
import java.util.List;

public class ArrayAdapterCompat<T> extends ArrayAdapter<T> {
    public ArrayAdapterCompat(Context context, int resource, List<T> entries) {
        super(context, resource, entries);
    }

    /**
     * Add all elements in the collection to the end of the adapter.
     * @param list to add all elements
     */
    @SuppressLint("NewApi")
    public void addAll(Collection<? extends T> list) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            super.addAll(list);
        } else {
            for (T element : list) {
                super.add(element);
            }
        }
    }

    /**
     * Add all elements in the array to the end of the adapter.
     * @param array to add all elements
     */
    @SuppressLint("NewApi")
    public void addAll(T... array) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            super.addAll(array);
        } else {
            for (T element : array) {
                super.add(element);
            }
        }
    }
}

答案 4 :(得分:1)

使用textList.add方法,在stringlist中循环,并逐个添加到textList。

答案 5 :(得分:1)

您可以在自定义类上扩展ArrayAdapter,并实现自己的addAll方法。如果使用ArrayList而不是String数组会更简单,因此您可以在不重建整个数据集的情况下添加数据。

编辑:我记得你可以修改你提供给你的适配器的提供的数组(或arraylist),然后调用notifyDataSetChanged。这应该更新你的清单。

答案 6 :(得分:0)

我很晚才看到这个帖子,但以下解决方案很容易为我实现:

public class CustomAdapter extends ArrayAdapter<String>...

public void setData(ArrayList<String> items) {
    clear();
    setNotifyOnChange(false);
    if (items != null) {
        for (String item : items)
            add(item);
    }
    notifyDataSetChanged();
}

答案 7 :(得分:0)

只需iteration collection if statement version //mForecastAdapter.clear(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { mForecastAdapter.addAll(weekForecast); }else { for (String s : strings) { mForecastAdapter.add(s); } }

{{1}}