解决NestedScrollView 嵌套 RecyclerView出现的滑动冲突问题

NestedScrollView嵌套RecyclerView的xml代码:

  <android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fillViewport="true"
    android:theme="@style/ThemeOverlay.AppCompat.Light"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">


        <android.support.v7.widget.RecyclerView
            android:id="@+id/rc_listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="@null" />

        </android.support.v4.widget.NestedScrollView>

但是这样运行程序以后界面不对劲,经过多番搜索在github上找到了方法,链接是https://github.com/ngocchung/NestedScrollView
重写 RecyclerView 的 LinearLayoutManager
MyLinearLayoutManager.class

import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;

public class MyLinearLayoutManager extends LinearLayoutManager {

    public MyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    private int[] mMeasuredDimension = new int[2];

    @Override
    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
                          int widthSpec, int heightSpec) {
        final int widthMode = View.MeasureSpec.getMode(widthSpec);
        final int heightMode = View.MeasureSpec.getMode(heightSpec);
        final int widthSize = View.MeasureSpec.getSize(widthSpec);
        final int heightSize = View.MeasureSpec.getSize(heightSpec);
        int width = 0;
        int height = 0;
        for (int i = 0; i < getItemCount(); i++) {

            if (getOrientation() == HORIZONTAL) {

                measureScrapChild(recycler, i,
                        View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
                        heightSpec,
                        mMeasuredDimension);

                width = width + mMeasuredDimension[0];
                if (i == 0) {
                    height = mMeasuredDimension[1];
                }
            } else {
                measureScrapChild(recycler, i,
                        widthSpec,
                        View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
                        mMeasuredDimension);
                height = height + mMeasuredDimension[1];
                if (i == 0) {
                    width = mMeasuredDimension[0];
                }
            }
        }
        switch (widthMode) {
            case View.MeasureSpec.EXACTLY:
                width = widthSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        switch (heightMode) {
            case View.MeasureSpec.EXACTLY:
                height = heightSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        setMeasuredDimension(width, height);
    }

    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
                                   int heightSpec, int[] measuredDimension) {
        View view = recycler.getViewForPosition(position);
        recycler.bindViewToPosition(view, position);
        if (view != null) {
            RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
            int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
                    getPaddingLeft() + getPaddingRight(), p.width);
            int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
                    getPaddingTop() + getPaddingBottom(), p.height);
            view.measure(childWidthSpec, childHeightSpec);
            measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
            measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
            recycler.recycleView(view);
        }
    }
}

在setAdapter方法之前:

rc_listview.setLayoutManager(new MyLinearLayoutManager(this, LinearLayoutManager.VERTICAL, true));

现在运行程序,滑动效果就好了

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
### 回答1: 嵌套ScrollViewRecyclerView时,可以使用NestedScrollView解决滑动冲突问题NestedScrollViewAndroid 5.引入的一个新控件,它可以嵌套其他可滑动的控件,如RecyclerView、ListView等。在嵌套时,需要在RecyclerView的外层包裹一个NestedScrollView,并在NestedScrollView中设置app:layout_behavior="@string/appbar_scrolling_view_behavior"属性,以便与AppBarLayout联动。同时,需要在RecyclerView中设置android:nestedScrollingEnabled="false"属性,以禁止RecyclerView自身的滑动事件。这样就可以实现NestedScrollView嵌套RecyclerView的效果了。 ### 回答2: NestedScrollView是一个可以嵌套滚动的视图容器,可以方便地实现嵌套滚动的效果。而RecyclerView是一个能够高效地维护大量数据的控件,它可以展示大数据集合,并且拥有灵活的布局以及可定制性。因此,嵌套ScrollViewRecyclerView的需求是非常普遍的。 在使用NestedScrollView嵌套RecyclerView的时候,需要注意以下几个问题: 1.布局的设置 嵌套布局时需要设置正确的布局层级,例如可以将NestedScrollView作为父布局,让它的孩子是RecyclerView。 2.增加嵌套滑动事件 NestedScrollView默认不具备嵌套滑动事件,因此需要在RecyclerView中增加相应的滑动事件来实现嵌套滑动。 3.优化RecyclerView性能 在RecyclerView中可能会存在大量的数据,因此需要做一些性能优化。例如可以使用ViewHolder来重用子视图,使用LayoutManager来管理子视图的布局等等。 4.合理设置RecyclerView高度 由于RecyclerView的高度需要根据具体情况来设置,因此需要根据每个item的高度来设置RecyclerView的高度,否则可能会出现一些问题。 综上所述,NestedScrollView嵌套RecyclerView需要考虑的问题比较多,需要开发者综合考虑各种情况来尽可能达到良好的用户体验和流畅的界面效果。 ### 回答3: NestedScrollView嵌套RecyclerView是常见的布局方式,可以应用在需要列表上下滑动,同时支持整个界面上下滑动的情况下。 NestedScrollViewAndroid 5.0之后提供的用于嵌套滑动的控件,它继承自ScrollView,但比ScrollView功能更强大,可以实现更复杂的嵌套滑动效果。而RecyclerViewAndroid系统提供的一个列表控件,比ListView具有更好的性能和灵活性。 在嵌套RecyclerView时,我们需要先将RecyclerView滑动事件交给外层的NestedScrollView来处理,这可以通过给RecyclerView设置一个OnTouchListener来实现。 同时,在NestedScrollView中,我们可以设置子view这个属性app:layout_behavior="@string/appbar_scrolling_view_behaviour",也就是将NestedScrollView滑动事件交给外层的AppBarLayout来处理。 在使用上,我们需要了解两个重要的方法:onNestedPreScroll和onNestedPreFling。这两个方法分别用于处理子view传递过来的滑动事件,我们需要在这两个方法中做出相应处理,从而实现NestedScrollView内部RecyclerView与外部AppBarLayout的联动效果。 另外,为了保证RecyclerView能够完全显示出来,我们还需要在RecyclerView的外层布局中设置android:layout_height="wrap_content"属性。 综上所述,NestedScrollView嵌套RecyclerView需要注意以下几点:将RecyclerView滑动事件交给外层的NestedScrollView处理;设置子view的app:layout_behavior;重写onNestedPreScroll和onNestedPreFling方法;设置RecyclerView的外层布局高度为wrap_content。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄油奥特曼

如果可以,请我喝一杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值