在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)
答案 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(如果已添加)