Как управлять размещением макета для левой и правой руки в Android RecyclerView

У меня есть левосторонний и правосторонний макет, который нужно поместить в соответствующий столбец в RecyclerView. Я использую StaggeredGridLayout, поскольку макеты также могут быть разных размеров. Я пытаюсь контролировать размещение дочерних макетов, и мне не очень повезло, так как после того, как левая / правая ориентация нарушается, она остается сломанной.

Как нарушается макет

GridLayoutManager лучше поддерживал порядок расположения макетов, но создавал странные интервалы при использовании макетов большего размера. Даже если бы я мог использовать GridLayoutManager, мне все равно понадобилась бы возможность контролировать левую / правую стороны, поскольку данные могут поступать в различных порядках.

Я также должен отметить, что этот RecyclerView уже находится внутри другого RecyclerView, поэтому адаптер и layoutManager устанавливаются внутри onBindViewHolder () родительского RV.


person JohnK    schedule 11.03.2021    source источник
comment
Разместите код, чтобы мы могли лучше понять, что вы пытаетесь сделать.   -  person CEO tech4lifeapps    schedule 12.03.2021


Ответы (1)


Вместо того, чтобы решить эту проблему с помощью параметров GridLayoutManager, я добавил GridLayout в xml.

        <GridLayout
            android:id="@+id/grid_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:columnCount="2"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/text_panel">

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/left_list"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="@id/grid_container" />

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/right_list"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="@id/grid_container" />

        </GridLayout>

Затем я разделил родительский ArrayList на правый и левый ArrayList в OnBindViewHolder (). У меня есть два дочерних RecyclerViews, но он работает, и у меня есть точный контроль над внешним видом.

        ArrayList<Breaker> leftList = new ArrayList<>();
        ArrayList<Breaker> rightList = new ArrayList<>();

        for(int i = 0; i < p.getCount(); i++) {
            if (p.getB(i).getType() % 2 == 0) {
                leftList.add(p.getB(i));
            } else {
                rightList.add(p.getB(i));
            }
        }

        LinearLayoutManager leftLayout = new LinearLayoutManager(h.leftBView.getContext());
        h.leftBView.setLayoutManager(leftLayout);
        MultiAdapter leftBAdapter = new MultiBAdapter(leftList,
                h.leftBView.getContext());
        h.leftBView.setAdapter(leftBAdapter);


        LinearLayoutManager rightLayout = new LinearLayoutManager(h.rightBView.getContext());
        h.rightBView.setLayoutManager(rightLayout);
        MultiBAdapter rightBAdapter = new MultiBAdapter(rightList,
                h.rightBView.getContext());
        h.rightBView.setAdapter(rightBAdapter);
person JohnK    schedule 11.03.2021