Если я говорил о моем сценарии здесь, ни один из приведенных выше ответов не будет работать, потому что у меня была активность, которая отображала список значений в БД вместе с кнопкой удаления, и когда нажата кнопка удаления, я хотел удалить этот элемент из списка .
Круто было то, что я использовал не представление рециркулятора, а простое представление списка, и это представление списка инициализировалось в классе адаптера. Таким образом, вызов 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);