Подтвердить что ты не робот

Как перекрыть элементы в LinearLayoutManager - RecyclerView (например, карты укладки)


Возможно ли перекрывать элементы из RecyclerView?
Я пытаюсь это сделать с помощью LinearLayoutManager.
Мои требования такие же, как в LinearLayoutManager, и мне просто нужно перекрыть элементы сверху вниз. (как сложение карт)

Я видел какой-то вариант с помощью ListView. Я полагаю, что возможно и в RecyclerView. Но после нескольких исследований, Я чувствую, что это займет довольно много времени для реализации пользовательских менеджер по компоновке и довольно много понимания по этому поводу. (Я посмотрел в пост Дэйва о создании пользовательского LayoutManager)

Итак, теперь я думаю, что мне, возможно, просто нужно использовать вариант ListView, основанный на моих требованиях, вместо того, чтобы справляться с такой большой сложностью Custom Layout Manager.

Но мне просто нужно, чтобы предметы внутри перекрывались. Я чувствую, что может быть какое-то другое направление, которое я еще не осознал. Пожалуйста, дайте мне знать, если есть кроме перечисленных выше ListView varient и Custom Layout Manager.

Я также опубликую свои выводы ниже здесь.

4b9b3361

Ответ 1

Я предполагаю, что вы ищете частичное перекрытие (например, колода карт слегка раздувается). Если это так, это выглядит довольно просто с RecyclerView и пользовательским ItemDecoration. Здесь тривиальный пример того, который перекрывает элементы на 90 пикселей вертикально:

public class OverlapDecoration extends RecyclerView.ItemDecoration {

  private final static int vertOverlap = -90;

  @Override
  public void getItemOffsets (Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

    outRect.set(0, vertOverlap, 0, 0);

  }
}

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

Добавьте это украшение в RV перед установкой layoutmanager. Я пробовал его с помощью StaggeredGrid, но он также должен работать с LinearLayout и Grid LM.

Ответ 2

Вы можете добиться, используя ItemDecoration из RecyclerView

установить ItemDecoration:

var customAdapter = CustomListAdapter()
recyclerView.addItemDecoration(MyItemDecoration()) // here set decoration in recyclerview
recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.adapter = customAdapter

создать класс ItemDecoration:

class MyItemDecoration : RecyclerView.ItemDecoration() {

    private val overlapValue = -60

    override fun getItemOffsets(outRect : Rect, view : View, parent : RecyclerView, state : RecyclerView.State) {
        outRect.set(0, 0, 0, overlapValue)  // args is : left,top,right,bottom
    }
}