我试图实现一个布局,其中包含RecyclerView和ScrollView在相同的布局。

布局模板:

<RelativeLayout>
    <ScrollView android:id="@+id/myScrollView">

       <unrelated data>...</unrealated data>

       <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/my_recycler_view" />
    </ScrollView>   
</RelativeLayout>

问题:我可以滚动到ScrollView的最后一个元素。

我尝试过的事情:

在ScrollView里面的卡片视图(现在ScrollView包含RecyclerView) -可以看到卡片直到RecyclerView。 最初的想法是使用RecyclerView来实现这个ViewGroup而不是ScrollView,其中一个视图类型是CardView,但我得到了与ScrollView完全相同的结果。


当前回答

尽管建议

永远不要把一个可滚动视图放在另一个可滚动视图中

这是一个很好的建议,但是如果你在回收器视图上设置了一个固定的高度,它应该可以正常工作。

如果你知道适配器项布局的高度,你就可以计算出RecyclerView的高度。

int viewHeight = adapterItemSize * adapterData.size();
recyclerView.getLayoutParams().height = viewHeight;

其他回答

在ScrollViews中放入RecyclerViews很好,只要它们不是自己滚动。在这种情况下,将其设置为固定高度是有意义的。

正确的解决方案是在RecyclerView高度上使用wrap_content,然后实现一个可以正确处理包装的自定义LinearLayoutManager。

复制这个LinearLayoutManager到你的项目:link

然后包装RecyclerView:

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

然后像这样设置:

RecyclerView list = (RecyclerView)findViewById(R.id.list);
list.setHasFixedSize(true);
list.setLayoutManager(new com.example.myapp.LinearLayoutManager(list.getContext()));
list.setAdapter(new MyViewAdapter(data));

编辑:这可能会导致滚动的复杂性,因为RecyclerView可以窃取ScrollView的触摸事件。我的解决方案是完全抛弃RecyclerView,使用LinearLayout,以编程方式膨胀子视图,并将它们添加到布局中。

另一种解决这个问题的方法是在ScrollView中使用ConstraintLayout:

<ScrollView>
  <ConstraintLayout> (this is the only child of ScrollView)
    <...Some Views...>
    <RecyclerView> (layout_height=wrap_content)
    <...Some Other Views...>

但我仍然会坚持使用杨培勇提出的androidx.core.widget.NestedScrollView方法。

将这一行添加到您的RecyclerView xml视图中:

android:nestedScrollingEnabled="false"

和您的RecyclerView将顺利滚动灵活的高度。

希望能有所帮助。

如果为RecyclerView设置固定高度对某些人(比如我)不起作用,这里是我添加到固定高度的解决方案:

mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        int action = e.getAction();
        switch (action) {
            case MotionEvent.ACTION_MOVE:
                rv.getParent().requestDisallowInterceptTouchEvent(true);
                break;
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

抱歉迟到了,但似乎有另一种解决方案可以完美地解决你提到的情况。

如果在回收器视图中使用回收器视图,它似乎工作得非常好。我亲自尝试并使用过它,它似乎一点也不慢,一点也不突兀。现在我不确定这是否是一个好做法,但嵌套多个回收器视图,甚至嵌套滚动视图减慢。但这似乎工作得很好。请试一试。我确信嵌套在这方面是完全没问题的。