RecyclerView не обновляет представление должным образом с видимостью группы ConstraintLayout - PullRequest
0 голосов
/ 02 июля 2018

Проблема:

Кажется, когда у меня есть определенная комбинация представлений и setVisibility между Visible и Gone, RecyclerView не обновляется должным образом после начальной загрузки. У меня есть RelativeLayout-> ConstraintLayout-> Constraint Group (с динамически установленной видимостью). Представление в группе ограничений не обновляется должным образом.

Пример использования Проблема:

Таким образом, связанный код под ним будет отображать вид поиска в верхней части. Исходное состояние пусто показывает представление должным образом (с показом значка поиска). Затем, если вы введете «T», значок поиска исчезнет (это не должно быть). Так что, если вы удалите T или наберете следующую букву «E», она снова появится. Также, если вы удалите весь текст поиска и снова наберете T, он покажет.

Просмотр кода:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/apk/res-auto">

<data>

    <variable
        name="vm"
        type="com.example.davidcorrado.myapplication.PlayerVM" />
</data>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/playerCell_main_layout"
        android:layout_width="match_parent"
        android:layout_height="84dp"


        android:layout_alignParentTop="true">

        <android.support.constraint.Group
            android:id="@+id/playerCell_status_group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="@{vm.showingStatusIcons}"

app:constraint_referenced_ids="playerCell_lineup_status_image" />

        <ImageView
            android:id="@+id/playerCell_lineup_status_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:src="@drawable/ic_search" />


    </android.support.constraint.ConstraintLayout>


</RelativeLayout>
</layout>

Причуды, которые могут помочь:

1) Если я переместу линию видимости в относительный план или метод ConstraintLayout, то все будет работать

2) Если я удалю представление RelativeLayout, то все будет работать.

См. Полный пример кода ниже: https://github.com/DavidCorrado/LayoutIssue

1 Ответ

0 голосов
/ 03 июля 2018

Насколько я могу судить, причина исчезновения значка поиска связана с вызовом ObservableList.clear (), а затем ObservableList.addAll (*)

Таким образом, исчезновение происходит в открытом состоянии, затем повторное появление происходит в addAll. Поскольку обратные вызовы в адаптере включаются при обоих вызовах, я догадываюсь, что он оживляет представление, а затем показывает, когда вызывается addAll.

Я подтвердил это, не выполняя действие List.clear (), а вместо этого в вашем слушателе textChange просто добавляя больше представлений в список.

Я не уверен, как бы вы очистили и добавили элементы в список без анимации очистки, возможно, есть некоторые параметры, которые вы можете переключать в RecyclerAdapter, чтобы игнорировать удаление представлений или не анимировать запись представлений?

Мой скорректированный код в вашем обратном вызове для класса PlayersListVM

class PlayersListVM {
    val filteredVms: ObservableList<ViewModel> = ObservableArrayList<ViewModel>()
    val showing = PlayerVM(isShowing = true)
    val missing = PlayerVM()

    init {
        filteredVms.add(showing)
    }

    fun onQueryChanged(newText: String) {
        if (filteredVms.size % 2 == 1) filteredVms.add(missing)
        else filteredVms.add(showing)
    }
}
...