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

У меня есть 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)

1 Ответ

0 голосов
/ 03 ноября 2019

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

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