0

У меня есть макет, в котором он имеет эффект параллакса. Таким образом, это те элементы, в нем -Найти первый полностью видимый элемент в recyclerview

  1. AppBarLayout
  2. CollapsingToolbarLayout внутри AppBarLayout
  3. Toolbar внутри CollapsingToolbarLayout
  4. RecyclerView

Все эти виды находятся в пределах CoordinatorLayout. Теперь мне нужно выяснить, что является первым полностью видимым элементом RecyclerView. Обычно я использовал следующую логику, чтобы получить его -

int firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition(); 

Но здесь я получаю много 1, когда даже 0th положение не видно полностью.

ответ

0

Я нашел его сам. Поскольку я использую AppBarLayout, мне нужно проверить, доступен ли конкретный вид на экране в этом конкретном прокрутке или нет.

Я сделал это:

@Override 
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 

     View v = recyclerView.getLayoutManager().getChildAt(1); 
     int offset = 0; 
     if (v != null) { 
      offset = v.getTop(); 
     } 

     if ((verticalOffset * -1) >= offset) { 
      layoutBuy.setVisibility(View.GONE); 
     } else { 
      layoutBuy.setVisibility(View.VISIBLE); 
     } 
    } 

Я использовал recyclerView.getLayoutManager().getChildAt(1);, потому что я хотел работать вокруг с этой конкретной позиции, которая 1.

Так, вертикальное смещение становится значения минус при прокрутке я умножил его - 1. Затем только что проверили, совпадает ли смещение и верх обзора, которое я ищу, или нет.

Таким образом, при использовании эффекта parallax на экране и в это же время необходимо проверить, какой вид виден в RecyclerView, ему нужна логика, как указано выше.

0

getChildAt начинается в первом видимом положении, а не в положении адаптера.

Вот результирующий код.

int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 
View v = layoutManager.getChildAt(0); 
if (firstVisiblePosition > 0 && v != null) { 
    int offsetTop = v.getTop(); 
    chatAdapter.notifyDataSetChanged(); 

    if (firstVisiblePosition - 1 >= 0 && chatAdapter.getItemCount() > 0) { 
     layoutManager.scrollToPositionWithOffset(firstVisiblePosition - 1, offsetTop); 
    } 
} 
+0

Нет. Я видел это решение где-то в другом месте. И это не работает для меня. Мне нужно сделать это, у меня есть вид, липкий снизу, и должен быть сделан «View.GONE», когда один и тот же вид был полностью видимым из «RecyclerView», и я не получаю обновления для прокрутки. –