0

Имеется фрагмент, в котором идёт запрос в базу, затем данные передаются в RecyclerView для формирования списка. По клику на пункт списка открывается активность, там кнопка удаления. По тапу на кнопку идёт запрос в базу на удаление и активность закрывается через финиш.

В методе onResume() отлавливается пункт списка, который был удалён и через mAdapter.notifyItemRemoved(deleteItem); идёт анимированое скрытие этого пункта из списка.

Всё отлично, но в нижней части экрана появляется дубликат последнего видимого пункта списка. Поискав наткнулся на несколько примеров одного и того же решения - добавление в адаптер своего метода для обновления списка и обращения к этому методу. Один из этих примеров описан в этом ответе от pavlofff

Но почему-то у меня при обращении к методу адаптера в onResume() или onCreateView() само название метода подсвечивается красным (как будто метод отсутствует), а в самом адаптере название метода подсвечивается серым (как будто метод не используется) и естественно ничего не работает.

screen

katso
  • 10,991
Gamlet
  • 173
  • Скорее всего тип переменной адаптера неверен. Покажите объявление оного и имя класса адаптера – ЮрийСПб Oct 03 '17 at 12:33
  • @ЮрийСПб, не знаю правильно ли будет дублировать информацию из одного вопроса в другой. На всякий случай не буду рисковать. Код фрагмента и адаптера я разместил в предыдущем вопросе по схожей проблеме. Только сейчас этот код дополнен onResume и самими методом в адаптере. Посмотрите, пожалуйста. – Gamlet Oct 03 '17 at 12:46
  • В том вопросе нет указания типа объявленной переменной – ЮрийСПб Oct 03 '17 at 12:58
  • @ЮрийСПб, прошу прощения. В терминах не силён. Что именно и куда нужно прописать? – Gamlet Oct 03 '17 at 13:06
  • 1
    У вас есть переменная в фрагменте с именем myAdapter. Если вы у неё не можете вызвать метод, описанный в адаптере, то, видимо, тип её определён не как RecyclerAdapterTab1, а что-то типа RecyclerView.Adapter. Т.е. RecyclerView.Adapter mAdapter. Если так, то надо лишь заменить тип переменной на тип вашего адаптера, т.е. на RecyclerAdapterTab1. Ну или скастовать к нему при вызове метода. – ЮрийСПб Oct 03 '17 at 13:27
  • А удалённый из базы элемент из списка mDataset вы удаляете? mDataset.remove(deletedItem); Перед тем как сделать mAdapter.notifyItemRemoved(deleteItem);. – eugeneek Oct 03 '17 at 14:24
  • @ЮрийСПб, спасибо вам большое!! Действительно всё именно так, заменил как подсказали. Добавил mAdapter.setHasStableIds(true); во фрагменте и public long getItemId(int position) в адаптере. Теперь и информация в писке актуальна, и удаление пункта происходит с анимацией. Спасибо ещё раз, в который раз выручаете )) – Gamlet Oct 03 '17 at 14:28
  • @eugeneek, я делаю заново запрос в базу данных и в методе mAdapter.dataChanged(myData); отправляю их адаптеру. Там уже идёт обновление. Или это неверное решение? – Gamlet Oct 03 '17 at 14:30

1 Answers1

3

В данном случае метод класса RecyclerAdapterTab1 не виден компилятору, т.к. переменная объявлена с типом RecyclerView.Adapter, а у него такого метода нет.

Значит надо или сменить тип переменной

//RecyclerView.Adapter mAdapter;
RecyclerAdapterTab1 mAdapter;

или скастовать к нему при вызове метода

RecyclerView.Adapter mAdapter;

...

((RecyclerAdapterTab1)mAdapter).dataChanged(data);