Android 不滚动并显示所有项目的RecyclerView

Android 不滚动并显示所有项目的RecyclerView,android,android-recyclerview,Android,Android Recyclerview,我在ScrollView中有一个RecyclerView(和一些其他视图)。目前,RecyclerView的布局非常小(它显示了它包含的5个项目中的2个),并且它独立于ScrollView滚动,这显然不是很好。我想让RecyclerView不滚动并扩展,以便其所有项目都可见 (我知道在这种情况下使用RecyclerView是愚蠢的。我这样做只是因为在应用程序的其他地方我需要一个普通的带有滚动等功能的RecyclerView,但内容是相同的,我不想重复代码)。非常简单,只需将RecyclerVie

我在ScrollView中有一个RecyclerView(和一些其他视图)。目前,RecyclerView的布局非常小(它显示了它包含的5个项目中的2个),并且它独立于ScrollView滚动,这显然不是很好。我想让RecyclerView不滚动并扩展,以便其所有项目都可见


(我知道在这种情况下使用RecyclerView是愚蠢的。我这样做只是因为在应用程序的其他地方我需要一个普通的带有滚动等功能的RecyclerView,但内容是相同的,我不想重复代码)。

非常简单,只需将
RecyclerView
的高度设置为
wrap\u content

您还可以从禁用“回收器”视图上的嵌套滚动中获益,如下所示:

RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler);
recycler.setNestedScrollingEnabled(false);
还可以尝试玩:

android:overScrollMode

setNestedScrollingEnabled(false)的解决方案没有达到应有的完整程度:您需要对NestedScrollView的子级使用NestedScrollView而不是ScrollViewfocusableInTouchMode=“true”

如果坚持使用ScrollView,还应将minHeight设置为RecyclerView,并将overScrollMode=“从不”设置为overScrollMode。在这种情况下,它仍然不是一个好的解决方案,因为在某些情况下,最小高度可能不够

您应考虑的其他替代解决方案:

  • 将ScrollView&RecyclerView替换为单个RecyclerView,该视图中的视图具有与ScrollView中的视图相同的其他视图类型

  • 改用GridLayout或其他布局


  • 以下是在“回收器”视图中禁用滚动并显示布局中所有项目的代码。它可能会起作用:

    public class NoScrollRecycler extends RecyclerView {
    
        public NoScrollRecycler(Context context){
            super(context);
        }
    
        public NoScrollRecycler(Context context, AttributeSet attrs){
            super(context, attrs);
        }
    
        public NoScrollRecycler(Context context, AttributeSet attrs, int style){
            super(context, attrs, style);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev){
    
            //Ignore scroll events.
            if(ev.getAction() == MotionEvent.ACTION_MOVE)
                return true;
    
            //Dispatch event for non-scroll actions, namely clicks!
            return super.dispatchTouchEvent(ev);
        }
    }
    
    这样使用:

    <com.example.custom.NoScrollRecycler
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/color_white"/>
    

    也许第一眼就不完全清楚如何处理这些答案。 我刚试过,有效的方法是:

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
            android:id="@+id/person_properties"
            android:orientation="vertical"
            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"
                android:overScrollMode="never" />
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
    
    
    ...
    

    无需以编程方式更改任何内容。

    一种简单的方法是在自定义适配器中,在
    onBindViewHolder
    方法中使用这一行:
    holder.setIsRecyclable(false)

    你应该替换你的滚动视图用于androidx.core.widget.NestedScrollView和matchparent,它简单且工作正常。

    我意识到我使用了
    底部导航视图
    ,它阻止了我的回收器视图显示最后一个项目。我通过添加
    paddingBottom
    来修复它:

        <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recipient_list"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:paddingBottom="70dp"
                    app:layout_constraintTop_toBottomOf="@id/view"
                    />
    

    在activity.xml文件中

    <androidx.core.widget.NestedScrollView 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ActivityName">
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/RecyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:nestedScrollingEnabled="false">
    
         </androidx.recyclerview.widget.RecyclerView>
    
    </androidx.core.widget.NestedScrollView>
    
    
    

    在RecyclerView中,使用android:nestedSrollingEnabled=“false”
    并使用NestedScrollView
    作为父滚动视图

    如果在ScrollView内部使用RecyclerView,则将
    ScrollView
    替换为
    NestedScrollView
    ,并启用嵌套滚动

    android:nestedScrollingEnabled="false"
    


    这解决了我的问题

    可能recyclerView的父对象是constraintLayout将其更改为RelativeLayout

    ScrollView不是为处理嵌套滚动而构建的。您是否选中了NestedScrollView是否在“NonScrollRecyclerView”中一次显示所有项目?由于某种原因,在我添加了3个以上类似问题的项目后,我的recyclerview似乎没有重新计算其高度。你找到解决办法了吗@杰弗森塔瓦雷斯?我已经禁用了使用wrap_内容和嵌套滚动。您可以手动设置RecyclerView高度。使用RecyclerView在这种情况下并不愚蠢,原因正是您自己解释的;-)这是正确的。另一方面,我确实将
    RecyclerView
    的高度设置为
    wrap\u content
    。我所面临的问题与一个尴尬的组合有关,即获取具有毕加索异步性的视图,以及视图进出可见区域。这是一个完全独立的q/a主题。您忘了提到必须使用NestedScrollView而不是ScrollView。我已经在下面写过了。采用这种方法,你是不是在回收视图的过程中没有丢失“回收者”视图,只是在一个大的滚动视图中创建一个包含所有视图的大列表?如果你试图在“回收者”视图中加载大量项目,可能会“滞后”。@William是的,这就是RecyclerView上的wrap_内容的要点。它将绑定所有项目。我个人认为这是一个Buff-ValueReVIEW应该回收,当项目是屏幕外,不仅当项目超出界限。但是我提交的bug被忽略了。因此,现在您可能应该只对小数据集使用wrap_内容,或者使用按钮加载更多项目。@Natario是的,我遇到了这个问题,为了解决这个问题,我在滚动nestedscrollview时手动计算recyclerview高度。这样做不会有任何滞后,而且速度相当快。在
    scrollView
    内部使用
    recyclerView
    是否会影响性能?如果你实现得好,它应该不会影响性能。@VadimKotov Docs与什么相关?@androiddeveloper对NestedScrollView的这种行为,RecyclerView@VadimKotov对不起,这是很久以前的事了。同意,
    android:overScrollMode=“never”
    是一个不错的添加,因为它隐藏了超卷Scrims。这并不能提供问题的答案。一旦你有足够的钱,你将能够;相反这是唯一对我有效的答案——我有一个滚动视图,其中包含两个RecyclerViews。