我正在尝试使用全新的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()之前,您是如何做到这一点的?感谢。
答案 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是首选并且非常常用,特别是在需要在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}}