Адаптер массива notifyDataSetChanged () не будет работать - PullRequest
6 голосов
/ 10 января 2012

Я тратил слишком много времени на это, поэтому должен спросить снова.Я понятия не имею, почему это происходит вообще.

У меня есть адаптер массива (aAdapter) и список массивов (aList), и я пытаюсь поставить кнопку очистки, чтобы стереть записи в базе данныхи очистить список.

Моя проблема в том, что NotifyDataSetChanged () просто не будет работать изнутри моего метода onlick:

public void clearDB(View view) {
    aList.clear();
    aAdapter.notifyDataSetChanged();
    HighScoresDB hsdb = new HighScoresDB(HighScoresActivity.this);
    hsdb.openDB();
    hsdb.clearDB();
    hsdb.closeDB();

}

Это работает везде, хотя.Я даже пытался поместить clear и notifyDataSetChanged () в другой метод и вызывать его, но это тоже не работает, но работало, когда я вызывал его из onCreate ....

Есть идеи?

ps база данных очищается.

Ответы [ 5 ]

12 голосов
/ 10 января 2012

Во-первых, я считаю, что реализация адаптера Android очень несовершенна. Когда дело доходит до выполнения чего-то сделанного на заказ, кажется, есть неоднозначные объяснения того, как его использовать, и официальная документация не разъясняет ни одного из них. Я был бы очень рад, если бы мне это удалось.

Способ получения последовательных результатов при редактировании данных в представлении был следующим:

  • Все изменения в представляемой базовой структуре данных должны быть выполнены в AsyncTask , который имеет смысл, поскольку вы меняете вещи в потоке пользовательского интерфейса и не хотите проблем с параллелизмом.

  • Операции над базовыми структурами данных должны выполняться путем вызова методов адаптера, поэтому если у вас есть ListAdapter, то вы используете add, remove и clear адаптера списка. Это означает, что адаптер управляет уведомлениями о просмотре и т. Д. Это обычно приводит к необходимости создания настраиваемого адаптера, поскольку доступные методы ограничены (в версии SDK даже нет добавления add all до 7). Вы также получите адаптер, выступающий в роли большого жирного контроллера , хотя я знаю, что мы не должны рассматривать Android как шаблон MVC, это все равно кажется неправильным.

  • Я создал приложения, в которых я пропускаю вызовы адаптера для работы с базовой структурой данных, и она работала на протяжении всех результатов, что оказалось непредсказуемым, если вы не управляли уведомлениями в представлении. Теперь я просто звоню через адаптер.

Так что, хотя я не могу объяснить, почему в notifiyDataSetChanged не работает конкретно в вашем onClick методе. Я надеюсь, что предоставлю полезную информацию, которая может помочь вам заставить ваше приложение работать должным образом.

9 голосов
/ 10 января 2012

Хотя это не красиво, вы можете просто переинициализировать адаптер вместо того, чтобы уведомить его, я видел, что иногда это единственный способ заставить его работать.

2 голосов
/ 12 февраля 2012

Таким образом, я решил проблему, аналогичную этой, - это, в основном, повторно инициализировать адаптер, как сказал вслепую.

    public class Example extends Activity{
        CustomAdapter adapter;
        ArrayList<ArrayList<String>> info = new ArrayList<ArrayList<String>>();
        final ListView list = (ListView) findViewById(R.id.listView_custom);
        adapter = new CustomAdapter(this, diceInfo.get(id));
        list.setAdapter(adapter);

Затем в слушателе onclickвсе инициализировано, но дело доходит до сути.Я просто делаю новый адаптер и устанавливаю его в список, который у меня есть.Хорошо работает.

0 голосов
/ 02 июля 2015

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

По данным developer.android.com ,

[onNotifyDataSetChanged ()] Уведомляет прикрепленных наблюдателей о том, что базовые данные были изменены, и любое представление, отражающее набор данных, должно само обновиться.

Вместо того, чтобы Adapter сообщал представлению о необходимости обновления, просто обновите данные, используя adap.clear () и adapter.add (), а затем принудительно обновите ListView, снова вызвав listView.setAdapter (адаптер).

0 голосов
/ 08 июня 2012

Также столкнулся со странным поведением адаптера при использовании в диалоге. После обновления адаптера (или базовой структуры - в обе стороны) и диалоговое окно notifiyDataSetChanged исчезает без ошибок или других следов в LogCat или отладке Eclipse. Точно такой же код, когда адаптер применяется к нормальной деятельности (ListView), работает нормально.

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