java.lang.UnsupportedOperationException:RecyclerView不支持滚动到绝对位置

时间:2015-02-10 09:41:47

标签: android

在Samsung GT-S7562 Android 4.0.4上出现此错误。我没有通过代码调用scrollTo方法。它被内部调用。请帮忙

java.lang.UnsupportedOperationException: RecyclerView does not support scrolling to an absolute position.
            at android.support.v7.widget.RecyclerView.scrollTo(RecyclerView.java:941)
            at android.view.View.setScrollX(View.java:7010)
            at android.animation.PropertyValuesHolder.nCallIntMethod(Native Method)
            at android.animation.PropertyValuesHolder.access$200(PropertyValuesHolder.java:35)
            at android.animation.PropertyValuesHolder$IntPropertyValuesHolder.setAnimatedValue(PropertyValuesHolder.java:815)
            at android.animation.ObjectAnimator.animateValue(ObjectAnimator.java:476)
            at android.animation.ValueAnimator.animationFrame(ValueAnimator.java:1145)
            at android.animation.ValueAnimator.setCurrentPlayTime(ValueAnimator.java:551)
            at android.animation.LayoutTransition.startChangingAnimations(LayoutTransition.java:813)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1805)
            at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2632)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4517)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
            at dalvik.system.NativeStart.main(Native Method)

7 个答案:

答案 0 :(得分:38)

我有同样的问题,对我来说是因为我有

android:animateLayoutChanges="true"

表示我的回收者视图的父级。我删除了它,它工作。

答案 1 :(得分:23)

您将在某些三星,索尼,...... ICS的实施中出现此错误。我已经成立,其中包括奇怪的内部视图管理。 对此的一个解决方案是使用您自己的类扩展 RecyclerView (或生成问题的类)并使用该类。在那堂课中你基本上会吃#34;吃#34;这些设备的所有可能的渲染异常。这很丑陋,但它很糟糕,但我能解决这类问题。

针对scrollTo ....的具体问题。

package com.stackoverflow.customviews;

public class CustomRecyclerView extends RecyclerView{

  private static final String TAG = "CustomRecyclerView";

  public CustomRecyclerView(android.content.Context context) {
    super(context);
  }

  public CustomRecyclerView(android.content.Context context, android.util.AttributeSet attrs) {
      super(context, attrs);
  }

  public CustomRecyclerView(android.content.Context context, android.util.AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
  }

  @Override
  public void scrollTo(int x, int y) {
      Log.e(TAG, "CustomRecyclerView does not support scrolling to an absolute position.");
     // Either don't call super here or call just for some phones, or try catch it. From default implementation we have removed the Runtime Exception trown 
  }
}

然后你可以在你的布局xml中替换这个新类:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

<com.stackoverflow.customviews.CustomRecyclerView
    android:id="@+id/my_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:overScrollMode="never"
    android:scrollbars="vertical" />

</FrameLayout>

答案 2 :(得分:14)

要以编程方式进行滚动,您需要使用LayoutManager。例如,LinearLayoutManager具有scrollToPositionWithOffset。 GridLayoutManager扩展了LinearLayoutManager - 所以你也可以使用它。代码对我有用:

RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
   LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
   linearLayoutManager.scrollToPositionWithOffset(0, newTopMargin - defaultMargin);
}

答案 3 :(得分:4)

由于回收者父级中的以下内容,我遇到了同样的警告问题:

android:animateLayoutChanges="true"

如果你想保留动画,只需将回收者放在另一个父亲身上,如framelayout。它对我来说很好,动画也很好。

答案 4 :(得分:2)

正如其他人在react-native-camera的父级布局中的回答android:animateLayoutChanges="true"中说的那样,导致了此问题,但是解决方案比其他人说的容易。

只需将您的RecyclerView放入没有RecyclerView属性的新Layout中即可。

例如:

android:animateLayoutChanges

答案 5 :(得分:0)

仅当RecyclerView位于具有XML属性的直接父视图

内时,才会显示警告
android:animateLayoutChanges="true"
像@Aalap和@luis所说的那样(@luis甚至给出了一个如何让这个XML attr保持几乎相同的布局层次结构的想法)。

我想发布一点点diff选项。如果您遇到这种情况,您可能想要在父布局内​​部进行一些视图更改动画,但不要在RecyclerView内部进行动画处理,否则这个会有点错误。如果您需要RecyclerView动画,最好在RecyclerView适配器内执行此操作,而不是XML。

所以最后如果你需要在RecyclerView之外发生变化时需要动画,最好放

android:animateLayoutChanges="true"

不进入RecyclerView的父视图,而是进入要设置动画的视图的父视图。

简短的例子:

<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"/>

这意味着:避免使用具有android:animateLayoutChanges =“true”的父视图包装RecyclerView

答案 6 :(得分:-2)

删除scrollView(如果已添加)