ListViews - как использовать функцию ArrayAdapter.addAll () до API 11? - PullRequest
17 голосов
/ 13 марта 2012

Я пытаюсь обновить ListView с совершенно новым ArrayList.Для 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. 

Как вы это делали до того, как addAll () был представлен в API 11?Спасибо.

Ответы [ 8 ]

19 голосов
/ 07 сентября 2012

Вот полный блок кода, который использует встроенную функцию addAll () для устройств Android с SDK_INT> = 11 и использует обходной цикл для устройств с уровнем 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);
            }
        }
    }
}

Аннотация @TargetApi(11) используется с ADT 17 для подавления предупреждений Lint, когда у вас есть <uses-sdk android:minSdkVersion="X"/> в AndroidManifest.xml, где X меньше 11. См. http://tools.android.com/recent/lintapicheck для получения дополнительной информации.

11 голосов
/ 13 марта 2012

Самый простой способ - избегать использования 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.

4 голосов
/ 13 декабря 2012

Я соединил ответы Барбо и Виллэри в то, что я считаю хорошим решением:

@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 голосов
/ 15 декабря 2013

Я построил на коде других людей онлайн, и я создал это.Просто используйте этот класс везде, где нужно, вместо 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);
            }
        }
    }
}
1 голос
/ 13 марта 2012

Вы можете расширить ArrayAdapter для пользовательского класса и реализовать свой собственный метод addAll.Было бы проще, если бы вы использовали ArrayList вместо массива String, поэтому вы можете добавлять данные, не перестраивая весь набор данных.

Редактировать: я вспомнил, что вы можете просто изменить предоставленный массив (или массив), который выподается в адаптер, а затем вызвать notifyDataSetChanged.Это должно обновить ваш список.

1 голос
/ 13 марта 2012

с использованием метода textList.add, цикл в списке строк и один за другим добавляются в textList.

0 голосов
/ 08 января 2016

просто нужно просто 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);
            }
        }
0 голосов
/ 06 сентября 2012

Я наткнулся на эту тему поздно, но мне было легко реализовать следующее решение:

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...