RecyclerView日志声明:W / RecyclerView:RecyclerView不支持滚动到绝对位置。请改用scrollToPosition

时间:2017-11-05 19:56:03

标签: android android-recyclerview logcat

我正在更新旧的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次以上

但是,据我所知,在我的代码中,我没有滚动到绝对位置。 (除非它可能是其他东西的副产品)

我无法找到有关此警告的更多信息。

任何人都可以提供见解吗?

2 个答案:

答案 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);