Как выделить хорошо видимый вид элемента в RecyclerView

#java #android #android-recyclerview #android-adapter

#java #Android #android-recyclerview #android-адаптер

Вопрос:

У меня есть ImageView и TextView внутри CardView.
Альфа-код CardView установлен на .5f.
CardView используется в вертикальном RecyclerView.
То, что я пытаюсь здесь сделать, это то, что при прокрутке пользователем повторного просмотра альфа полностью видимого CardView всегда должна меняться на 1f, а для не полностью видимых просмотров карт альфа остается .5f.
Одновременно отображается только один полностью видимый CardView.

Вот что я пробовал, но это не работает.

  @Override
 public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
      super.onScrolled(recyclerView, dx, dy);

      int center = recyclerView.getHeight() / 2;
      View centerView = recyclerView.findChildViewUnder( recyclerView.getTop(), center);
      int centerPos = recyclerView.getChildAdapterPosition(centerView);

       if (prevCenterPos != centerPos) {
            // dehighlight the previously highlighted view
            View prevView = 
           recyclerView.getLayoutManager().findViewByPosition(prevCenterPos);
           if (prevView != null) {
               prevView.setAlpha(.5f);
           }

           // highlight view in the middle
           if (centerView != null) {
                prevView.setAlpha(1f);
           }

           prevCenterPos = centerPos;
        }

}
  

Ответ №1:

Поскольку вы находите центральную точку с помощью этого

 int center = recyclerView.getHeight() / 2;
  

какой неправильный способ вы должны использовать:

 mLayoutManager.findFirstCompletelyVisibleItemPosition()
  

попробуйте это:

 val firstCompelteVisible = mLayoutManager.findFirstCompletelyVisibleItemPosition()
val centerView =
    recyclerView.layoutManager!!.findViewByPosition(firstCompelteVisible)
if (prevCenterPos != centerPos) {
    // dehighlight the previously highlighted view
    val prevView =
        recyclerView.layoutManager!!.findViewByPosition(prevCenterPos)
    if (prevView != null) {
        prevView.alpha = .5f
    }

    // highlight view in the middle
    if (centerView != null) {
        prevView!!.alpha = 1f
    }
    prevCenterPos = centerPos
}
  

Я надеюсь, что это сработает.

Комментарии:

1. Это работает только при прокрутке вниз. но при прокрутке всех просмотров карт альфа равна 1f. Мой приведенный выше код работает при прокрутке вверх и вниз. Единственная проблема заключается в том, что при прокрутке вниз, когда я достигаю позиции 4 (вид по центру), его альфа изменяется на1f, что хорошо, но затем сразу же возвращается к .5f.