我正在更新旧的Android项目,现在我反复从RecyclerView获取此日志语句:
W/RecyclerView: RecyclerView does not support scrolling to an absolute position. Use scrollToPosition instead
首次填充并显示recyclerview时,或者当Recyclerview中的项目被刷新时,就会发生这种情况。
logcat的:
11-05 14:02:23.290 20209-20209/com.mydomain W/RecyclerView: RecyclerView does not support scrolling to an absolute position. Use scrollToPosition instead
11-05 14:02:23.290 20209-20209/com.mydomain W/RecyclerView: RecyclerView does not support scrolling to an absolute position. Use scrollToPosition instead
11-05 14:02:23.607 20209-20209/com.mydomain W/RecyclerView: RecyclerView does not support scrolling to an absolute position. Use scrollToPosition instead
11-05 14:02:23.607 20209-20209/com.mydomain W/RecyclerView: RecyclerView does not support scrolling to an absolute position. Use scrollToPosition instead
11-05 14:02:23.629 20209-20209/com.mydomain W/RecyclerView: RecyclerView does not support scrolling to an absolute position. Use scrollToPosition instead
[...]
该行重复约40次以上
但是,据我所知,在我的代码中,我没有滚动到绝对位置。 (除非它可能是其他东西的副产品)
我无法找到有关此警告的更多信息。
任何人都可以提供见解吗?
答案 0 :(得分:1)
我看到的是完全一样的东西,在我看来,这是由XML属性引起的
android:animateLayoutChanges="true"
在RecyclerView的父视图上-或以编程方式在父视图上设置LayoutTransition,这样做是相同的。参见this answer on a different SO question。 (在以前的Android版本中,它看起来曾经是例外,而不是日志,在这一方面我们很幸运。)
显然,删除属性可以修复该问题。如果(像我一样)想要保留它,请尝试以某种方式组织视图,以使RecyclerView的直接父级不包含它,就像我链接到的帖子中的Sniper所建议的那样。复制他的示例,以防万一它被删除:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/top_parent_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:id="@+id/header_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
android:clickable="true"
android:animateLayoutChanges="true">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/header_arrow_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="end|center_vertical"/>
</FrameLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
如果(像我一样)您需要在RecyclerView上使用LayoutTransition动画,则在RecyclerView和带有布局动画的视图之间放置一个包装器视图就足以消除警告:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:animateLayoutChanges="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</FrameLayout>
</LinearLayout>
基本上请确保android:animateLayoutChanges属性不在RecyclerView的父级上。
尽管有警告,实际的布局更改动画仍然可以正常工作。我不知道在视图层次结构中添加图层对性能的影响是否值得。更好的解决方案可能是对RecyclerView进行子类化,并覆盖scrollTo(x,y)方法以不打印日志,例如another answer on the same SO question。
答案 1 :(得分:1)
将此行放入Adapter构造函数中,也许对您有用:
this.setHasStableIds(true);