gpt4 book ai didi

android - 由 SwipeRefreshLayout 触发时在 RecyclerView 中执行 LayoutAnimation 时出现问题

转载 作者:行者123 更新时间:2023-11-29 02:21:31 26 4
gpt4 key购买 nike

我正在尝试使用 XML 属性 android:layoutAnimation 在我的 RecyclerView 中执行自定义动画。

问题是:当我直接在 Activity 的 onCreate() 中填充我的适配器时,动画会正常触发。但是,当我尝试从 SwipeRefreshLayout.setOnRefreshListener 填充我的 recyclerView 时,动画未正确触发。

我不知道哪里出了问题。

依赖

implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha04'

XML文件

Activity XML:

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/postListRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation_enter_up"
android:paddingTop="8dp"
android:paddingBottom="8dp" />

layout_animation_enter_up.xml:

<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_enter_up"
android:animationOrder="normal"
android:delay="15%" />

item_animation_enter_up.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600">

<translate
android:fromYDelta="50%p"
android:interpolator="@android:anim/decelerate_interpolator"
android:toYDelta="0" />

<alpha
android:fromAlpha="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1" />

</set>

My Code简化版

此代码会正确触发layout_animation_enter_up 动画:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post_list)

val adapter = PostsAdapter()
postListRecyclerView.adapter = adapter
val dummyData = Post(1, "Title", "Body", 1, "Name")
val postList = listOf(dummyData, dummyData, dummyData, dummyData, dummyData, dummyData, dummyData)

adapter.submitList(postList)
}

这段代码不会触发layout_animation_enter_up动画:

override fun onCreate(savedInstanceState: Bundle?) {
postListSwipeRefreshLayout.setOnRefreshListener {
val adapter = PostsAdapter()
postListRecyclerView.adapter = adapter
val dummyData = Post(1, "Title", "Body", 1, "Name")
val postList = listOf(dummyData, dummyData, dummyData, dummyData, dummyData, dummyData, dummyData)

adapter.submitList(postList)
}
}

在这两个代码 fragment (基本相同)中,我认为 RecyclerView 正在从空状态变为填充状态。如果我在 setOnRefreshListener 回调或 onCreate 中填充我的适配器,在 UI 视角上有什么不同吗?

编辑:上面的代码 fragment 与原始代码库不同,只是为了便于解释。我不想知道这个问题的表现。我想知道为什么动画在第二个 fragment 中不起作用,而在第一个 fragment 中却能正常工作。

最佳答案

如果您在刷新中提交列表,基本上第一个 fragment 应该有效,即:

postListSwipeRefreshLayout.setOnRefreshListener {
adapter.submitList(postList)
}

第二段代码不应触发动画,因为每次刷新布局都会创建一个新的适配器实例,这会使适配器无法观察到变化。

我不知道为什么每次刷新布局时都要创建一个新实例,但是这会消耗无用实例的内存。

总结:您应该只创建一次实例,并尽可能多地重复使用它,而不是创建新实例。

关于android - 由 SwipeRefreshLayout 触发时在 RecyclerView 中执行 LayoutAnimation 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55331165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com