RecyclerView无法使用ConstraintLayout组可见性正确更新视图

时间:2018-07-02 19:01:58

标签: android android-constraintlayout

问题:

当我在Visible和Gone之间具有特定的视图和setVisibility组合时,RecyclerView在初始加载后无法正确更新。我有一个RelativeLayout-> ConstraintLayout-> Constraint组(具有动态设置的可见性)。约束组中的视图未正确更新。

问题用例示例:

因此,下面的链接代码将在顶部显示搜索视图。初始状态为空可正确显示视图(显示搜索图标)。然后,如果您键入“ 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)如果我将可见性线移动到relativeLayout或ConstraintLayout,那么一切似乎正常

2)如果我删除了RelativeLayout视图,则一切似乎正常。

有关完整的代码示例,请参见以下内容: https://github.com/DavidCorrado/LayoutIssue

1 个答案:

答案 0 :(得分:0)

据我所知,搜索图标消失的原因是由于先调用了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)
    }
}