Как я могу сообщить RecyclerView, что данные изменились из таймера внутри адаптера

У меня есть RecyclerView, где вы можете прокручивать элементы влево, чтобы заархивировать их. Сначала будет показан макет отмены, а затем через 2 секунды он будет заархивирован (теперь для первого теста я просто удаляю элемент). Проблема в том, что использование notifyItemRemoved(pos) из потока Timer приводит к сбою приложения, говорящего, что только исходный поток, создавший представление (поток пользовательского интерфейса), может касаться его представлений. Есть ли какой-нибудь трюк, чтобы обойти это? Я использую таймер внутри ViewHolder моего расширенного класса RecyclerView.Adapter.

Вот код таймера:

archiveTimer.schedule(new TimerTask() {
    @Override
    public void run() {
        notesController.remove(position);
        notesList.remove(position);
        queuedForArchive = false;
    }
}, 2000);

В действиях вы можете использовать runOnUiThread, но я тоже не могу это использовать (функция MainActivity.runOnUiThread(Runnable) не является статической, поэтому я не могу использовать ее вне MainActivity)


person Skaldebane    schedule 01.11.2019    source источник


Ответы (1)


Я нашел действительно хитрый способ запуска синхронизированных событий в потоке пользовательского интерфейса без использования таймера. Я заметил, что все аниматоры на самом деле синхронизированы, и вы можете применить onAnimationEnd к любому аниматору, который вы хотите, поэтому я сделал ObjectAnimator, который изменяет альфа-канал невидимого представления с 1 на 1 (без изменений) и установил его продолжительность на 2000 мс, которые мне были нужны. Я использовал тот же код, который хотел использовать в таймере внутри onAnimationEnd() этого аниматора, и это сработало!!! Весь код выполнялся в потоке пользовательского интерфейса, и изменения в других макетах не приводили к сбоям!

person Skaldebane    schedule 03.11.2019