Получить представление RecyclerView с помощью AdapterPosition


У меня есть RecyclerView с предварительным просмотром видео. Когда пользователь прокручивает, видео должно автоматически воспроизводиться на recyclerView-элементах, которые видны пользователю (когда состояние прокрутки неактивно).

Поэтому я написал пользовательский onScrollListener, который передает позиции, видимые пользователю в виде массива, в метод startVideosOn(int[] positions).

Но проблема в том, когда я хочу получить представление по позиции (позиция равна позиции адаптера). Когда я пытаюсь linearLayoutManager.getChildAt(index), я получаю null когда отображается 3-й элемент, потому что RecyclerView имеет только 2 ребенка, которые будут переработаны.

Итак, как мне удается получить View из RecyclerView по позиции адаптера?

Edit, это OnScrollListener:

public abstract class AutoPlayRecyclerOnScrollListener extends RecyclerView.OnScrollListener {

    LinearLayoutManager linearLayoutManager;

    public AutoPlayRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) {
        this.linearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);

        if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
            int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
            int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();

            if (firstVisibleItemPosition != -1 && lastVisibleItemPosition != -1) {
                playOn(firstVisibleItemPosition, lastVisibleItemPosition);
            }
        }
    }

    private void playOn(int lower, int upper) {
        int[] completelyVisibleItems = new int[upper - lower + 1];

        for (int i = lower, j = 0; i <= upper; i++, j++) {
            completelyVisibleItems[j] = i;
        }

        playOn(completelyVisibleItems);
    }

    public abstract void playOn(int[] items);
}
1 5

1 ответ:

Если вам нужно получить любую View для видимой "позиции", либо используйте:

RecyclerView#findViewHolderForAdapterPosition(int position)

Или

RecyclerView#findViewHolderForLayoutPosition(int position)

Возвращенный ViewHolder будет содержать View, который вы хотите