Как перекрывать элементы в 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
}
}