Recyclerview переполнен ConstraintLayout - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь создать обзор переработчика, который увеличивается в размере с дополнительными предметами до определенной максимальной высоты, а затем исчезает. Я понимаю, что макет Constraint - правильный путь к go здесь, и я клянусь, это работало уже месяц или около того go, и затем Recyclerview перестал заботиться о своем ограничении и быть видимым за пределами 280dp (см. Рисунок). вот мой код Я уверен, что это уже работает, я не знаю, изменил ли Google что-то для реализации "androidx.constraintlayout: constraintlayout: 2.0.0-beta4" или я медленно схожу с ума. Может кто знает как это исправить. может быть, его реализация до бета-версии. любая помощь будет высоко ценится.

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_tilemap"
android:layout_width="match_parent"
android:layout_height="wrap_content">


    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintHeight_default="wrap"
        app:layout_constraintHeight_max="280dp"
        app:layout_constrainedHeight="true"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:fadingEdge="horizontal"
        android:fadingEdgeLength="30dp"
        android:fillViewport="true"
        android:requiresFadingEdge="vertical"
        android:id="@+id/rv_comms"
        android:padding="0dp"
        android:clipToPadding="false" />


</androidx.constraintlayout.widget.ConstraintLayout>

enter image description here

1 Ответ

0 голосов
/ 02 марта 2020

Я только что нашел виновный код. Оказывается виноваты кнопки записи в моем адаптере. они включали следующий метод, который позволял кнопке переполнять представления других элементов адаптера (при нажатии кнопка будет расти, как в WhatsApp, см. изображение ниже)

public void setClip(View v) {
    if (v.getParent() == null) {
        return;
    }

    if (v instanceof ViewGroup) {
        ((ViewGroup) v).setClipChildren(false);
        ((ViewGroup) v).setClipToPadding(false);
    }

    if (v.getParent() instanceof View) {//this part is to blame
        setClip((View) v.getParent());
    }
}

рекурсивная природа метода (замечено уже закомментировано в последних 4 строках метода) в основном устанавливает для clipToPadding и clipChildren значение false для всей иерархии представлений от кнопки записи вверх, что приводит к странному переполнению. В итоге я вручную установил для clipToPadding и clipChildren значение false только для тех представлений, которые были связаны с адаптером (это позволило мне сохранить классную анимацию переполнения кнопки записи без проблем с угасающими краями), и теперь это выглядит довольно (см. Ниже).

this is what I was going for

...