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


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

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

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

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

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

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 перед установкой менеджера по расположению. Я пробовал это с StaggeredGrid, но он должен работать и с LinearLayout и Grid LM.

Вы можете добиться, используя 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
    }
}
Другие вопросы по тегам