Элемент RecyclerView с GridLayoutManager показывает разные позиции просмотра - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть вид рециркулятора, который использует менеджер компоновки сетки для отображения элементов в 2 столбцах, например: enter image description here

Если вы заметили, что нижнее поле изображения для левой строки отличается. В макете элемента у представления изображения есть свойство «alignparentbottom = true», но все элементы в левой строке имеют это неправильное поле снизу (файл png не имеет поля, я проверял). Я расширил RelativeLayout, чтобы сделать его квадратной формы следующим образом:

public class SquareRelativeLayout extends RelativeLayout {

private static final int HEIGHT_RATIO = 1;
private static final int WIDTH_RATIO = 1;

public SquareRelativeLayout(Context context) {
    super(context);
}

public SquareRelativeLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public SquareRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public SquareRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // Set a square layout.
    /*int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightSize = (int) (HEIGHT_RATIO / WIDTH_RATIO * widthSize);
    int newHeightSpec = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.EXACTLY);*/
    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}

}

Вот весь макет элемента:

<?xml version="1.0" encoding="utf-8"?>
<com.org.framework.ui.widget.SquareRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/transparent_round_rect"
    android:layout_marginTop="@dimen/margin_16" >
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:id="@+id/ll_top"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:weightSum="20"
            android:layout_marginTop="@dimen/margin_12"
            android:layout_marginRight="@dimen/margin_12"
            android:layout_marginLeft="@dimen/margin_12">

            <TextView
                android:id="@+id/tv_wallet_name"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="15"
                style="@style/SmallWhiteText"
                android:text="Reimbursement"
                android:ellipsize="end"
                android:lines="1"
                android:maxLines="1" />

            <RadioButton
                android:id="@+id/rb_select"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="5"
                android:layout_marginTop="-3dp"
                android:layout_gravity="end|center_vertical"
                android:buttonTint="@color/white" />

        </LinearLayout>

        <TextView
            android:id="@+id/tv_amount"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@style/LargeWhiteText"
            android:text="2000"
            android:layout_marginRight="@dimen/margin_12"
            android:layout_marginLeft="@dimen/margin_12"
            android:layout_below="@id/ll_top"/>

        <ImageView
            android:id="@+id/iv_wallet_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/gift"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            />
        <!--android:layout_marginRight="-1.5dp"
        android:layout_marginBottom="-7dp"-->

        <FrameLayout
            android:id="@+id/fl_na"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#435977"
            android:layout_alignParentBottom="true"
            android:padding="5dp"
            android:visibility="gone">

            <TextView
                android:id="@+id/tv_not_applicable"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/text_not_applicable"
                style="@style/VerySmallWhiteText"
                android:layout_gravity="center_horizontal"/>

        </FrameLayout>
    </RelativeLayout>

</com.org.framework.ui.widget.SquareRelativeLayout>

Первый - элементы не должны имеют разные нижние поля для левого и правого столбцов. В чем причина? во-вторых, я попытался программно исправить макет внутри метода onBindViewHolder (с / без наблюдателя дерева компоновки) следующим образом:

ViewTreeObserver tob = uvh.rlRoot.getViewTreeObserver();
            tob.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    uvh.rlRoot.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    Log.e("flNa", (uvh.flNa.getTop()+uvh.flNa.getHeight())+",");
                    Log.e("ivWallet", (uvh.ivLogo.getTop()+uvh.ivLogo.getHeight())+",");

                    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) uvh.ivLogo.getLayoutParams();
                    params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
                    //params.bottomMargin = 0;
                    //uvh.ivLogo.setBottom(-10);
                    uvh.ivLogo.setTop(uvh.rlRoot.getHeight()-uvh.ivLogo.getHeight());
                    uvh.ivLogo.setLayoutParams(params);

                    RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams) uvh.flNa.getLayoutParams();
                    params1.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
                    params1.bottomMargin = 1;
                    uvh.flNa.setLayoutParams(params1);

                    uvh.rlRoot.forceLayout();
                    uvh.rlRoot.invalidate();
                    uvh.rlRoot.requestLayout();
                }
            });

Это не влияет на макет. Как решить эту проблему?

...