Поймать событие анимации SmoothScroll в RecyclerView [Android] - PullRequest
0 голосов
/ 24 мая 2019

У меня есть GridLayout RecyclerView с присоединенным PageSnapHelper, который по сути действует как вертикальный линейный RecyclerView (я унаследовал код, не уверен, почему это было сделано). Цель состоит в том, чтобы выделить элемент, находящийся в данный момент в центре вида. Прокрутка выполняется из кода, управляемого двумя пунктами меню, чтобы имитировать движение вперед и назад с пульта. Прокрутка вида работает нормально. Кажется, проблема в том, что, когда я слушаю событие окончания прокрутки, происходит анимация, которая портит мой код, чтобы нарисовать подсветку вокруг элемента. Вот код, который я использую для прокрутки представления на основе пункта меню:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    //Get which arrow was pressed
    int id = item.getItemId();
   //Get count of items
    int itemCount = recyclerView.getAdapter().getItemCount();



    //Condition to moving down the list
    if (id == R.id.next) {
        //Make sure we're within bounds of the of the view from the top
        if(count>=itemCount-1) {
            return super.onOptionsItemSelected(item);
        }
        //Increment to count to next ViewHolder
        count++;
    //Condition for moving up list
    } else if (id == R.id.prev) {
        //Make sure we're within bounds
        if(count == 0){
            return super.onOptionsItemSelected(item);
        }
        //Decremennt to previous ViewHolder
        count--;
    }

    //Scroll the RecyclerView to the position we want
    layoutManager.setIsNext(id == R.id.next);
    recyclerView.smoothScrollToPosition(count);

    //If the item is already in view, then no scroll event is necessary and we can access the ViewHolder
    HighlightViewHolder(count);

    //In the event that the ViewHolder is off-screen listen for the end of the scrolling event to ensure the ViewHolder
    //is created and in correct position on the screen
    RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {

        //Add a listener to that looks out for when the scrolling is complete
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            Log.i("ScrollListener", "Scrolling has ended");
            HighlightViewHolder(count);
            recyclerView.removeOnScrollListener(this);

        }
    };

    recyclerView.addOnScrollListener(scrollListener);

    return super.onOptionsItemSelected(item);

Когда приложение запускается впервые, а я нажимаю кнопку «Вперед», первый элемент выделяется очень хорошо enter image description here

При следующем выборе, включающем событие прокрутки, возникает проблема: enter image description here

Я ожидал бы, что когда событие прокрутки закончится, элемент будет в центре. Исходя из того, что я вижу, я думаю, что есть какое-то анимационное событие, которое все еще происходит, которое я должен искать для завершения. Мой подсвечивающий код опирается на рассматриваемый вид, который находится в ожидаемом месте. Я новичок в Android, и мои поиски анимаций RecyclerView привели меня к ItemAnimator. Но, читая документы, я не уверен, что это то, что я ищу. Есть идеи?

1 Ответ

0 голосов
/ 24 мая 2019

Я не смог найти каких-либо событий, связанных с тем, что искал, поэтому я пошел вперед и использовал обработчик, чтобы подождать произвольное количество времени, прежде чем рисовать выделение.Я обновил Слушатель так:

//Add a listener to that looks out for when the scrolling is complete
            @Override
            public void onScrolled(final RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                Handler handler = new Handler();
                Runnable task = new Runnable() {
                    @Override
                    public void run() {
                        HighlightViewHolder(count);
                    }
                };

                handler.postDelayed(task, 500);
                recyclerView.removeOnScrollListener(this);
            }
...