Когда мы должны добавлять элементы в ArrayAdapter напрямую? - PullRequest
0 голосов
/ 05 марта 2019

В этом примере кода пользователь добавляет простые текстовые строки, используя add (T obj) ArrayAdapter.

ListView myList = findViewById(R.id.list_view);
final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
myList.setAdapter(listAdapter);
Button button = findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v){
        String val = "abc"; //just as an example
        listAdapter.add(val);
    }
}
);

Предполагается, что строковое значение происходит из текста редактирования.И вопрос в том, когда / почему мы должны добавить объект непосредственно в ArrayAdapter вместо того, чтобы изменять источник данных (ArrayList), а затем вызывать listAdapter.notifyDataSetChanged()

, будет ли фактический случай использования, когда нам придется напрямую работать сАдаптер массива?

1 Ответ

0 голосов
/ 06 марта 2019

когда / почему мы должны вместо этого добавить объект непосредственно в ArrayAdapter изменить источник данных (ArrayList), а затем вызвать listAdapter.notifyDataSetChanged ()

Существует 2 способа добавить элемент в ListView.

datasource.add(item);
listview.notifyDataSetChanged();

или

adapter.add(item);

На самом деле второй реализован так же, как первый с некоторой дополнительной проверкой под капотом, вот определение метода add из ArrayAdapter.

/**
 * Adds the specified object at the end of the array.
 *
 * @param object The object to add at the end of the array.
 * @throws UnsupportedOperationException if the underlying data collection is immutable
 */
public void add(@Nullable T object) {
    synchronized (mLock) {
        if (mOriginalValues != null) {
            mOriginalValues.add(object);
        } else {
            mObjects.add(object);
        }
        mObjectsFromResources = false;
    }
    if (mNotifyOnChange) notifyDataSetChanged();
}

mObjects относится к переменной datasource, поэтому они одинаковы.

Какой из них лучше?

Они немного отличаются друг от друга, возникает ситуация, если вы вызываете datasource.add(item) где-нибудь в программе и забыли вызвать listview.notifyDataSetChanged, тогда ваш список не будет обновлен. Чтобы избежать этого, вы должны использовать adapter.add(item);, поскольку он автоматически обновляет представление списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...