Как обновить список рассылки Android? - PullRequest
415 голосов
/ 12 февраля 2010

Как обновить Android ListView после добавления / удаления динамических данных?

Ответы [ 25 ]

0 голосов
/ 06 февраля 2014

при использовании SimpleCursorAdapter может вызывать changeCursor (newCursor) для адаптера.

0 голосов
/ 29 июля 2018

Предположим, вы передали список своему адаптеру.
Использование:

list.getAdapter().notifyDataSetChanged()

чтобы обновить ваш список.

0 голосов
/ 03 марта 2015

У меня был ArrayList, который я хотел отобразить в виде списка. ArrayList содержит элементы из mysql. Я переопределил метод onRefresh и в этом методе я использовал tablelayout.removeAllViews (); и затем повторил процесс для получения данных снова из базы данных. Но перед этим обязательно очистите ваш ArrayList или любую другую структуру данных, иначе новые данные будут добавлены к старой.

0 голосов
/ 08 октября 2018

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

Круто было то, что я использовал не представление рециркулятора, а простое представление списка, и это представление списка инициализировалось в классе адаптера. Таким образом, вызов notifyDataSetChanged() ничего не будет делать внутри класса адаптера и даже в классе активности, где инициализируется объект адаптера, потому что метод удаления был в классе адаптера.

Итак, решение состояло в том, чтобы удалить объект из адаптера в методе класса getView адаптера (чтобы удалить только этот конкретный объект, но если вы хотите удалить все, вызовите clear()).

Чтобы вы поняли, как выглядел мой код,

public class WordAdapter extends ArrayAdapter<Word> {
  Context context;

  public WordAdapter(Activity context, ArrayList<Word> words) {}
    //.......

    @NonNull
    @Override
    public View getView(final int position, View convertView, ViewGroup group) {
      //.......
     ImageButton deleteBt = listItemView.findViewById(R.id.word_delete_bt);
     deleteBt.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             if (vocabDb.deleteWord(currentWord.id)) {
                //.....
             } else{
                //.....
             }
             remove(getItem(position)); // <---- here is the trick ---<
             //clear() // if you want to clear everything
         }
    });
 //....

Примечание: здесь remove() и getItem() методы наследуются от класса Adapter.

  • remove() - чтобы удалить конкретный элемент, на который нажали
  • getItem(position) - это получить предмет (вот мой объект Word что я добавил в список) из позиции щелчка.

Вот так я настраиваю адаптер на просмотр списка в классе активности,

    ArrayList<Word> wordList = new ArrayList();
    WordAdapter adapter = new WordAdapter(this, wordList);

    ListView list_view = (ListView) findViewById(R.id.activity_view_words);
    list_view.setAdapter(adapter);
0 голосов
/ 09 июля 2013

Для меня после изменения информации в базе данных sql ничто не может обновить представление списка (точнее, расширяемое представление списка), поэтому, если notifyDataSetChanged () не помогает, вы можете сначала попытаться очистить список и добавить его снова после этого вызова notifyDataSetChanged (). Например

private List<List<SomeNewArray>> arrayList;
List<SomeNewArray> array1= getArrayList(...);
List<SomeNewArray> array2= getArrayList(...);
arrayList.clear();
arrayList.add(array1);
arrayList.add(array2);
notifyDataSetChanged();

Надеюсь, это имеет смысл для вас.

...