解决srcollview嵌套recycleview冲突

正常情况下NestedScrollView嵌套RecycleView,一是会出现只显示一行的情况,二是滑动异常即事件冲突。

解决方法:

1.也是最简单的方法,把design库和V7库升级到23.2以上,注意加上以下代码

 

?
1
2
3
4
5
mLinearLayoutManager.setSmoothScrollbarEnabled( true );
        mLinearLayoutManager.setAutoMeasureEnabled( true );
        cardslist_view.setLayoutManager(mLinearLayoutManager);
        cardslist_view.setHasFixedSize( true );
        cardslist_view.setNestedScrollingEnabled( false );
问题即可解决。

 

2.麻烦一点,重写LinearLayoutManager和NestedScrollView。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
public class CustomLinearLayoutManager extends LinearLayoutManager {
 
     public CustomLinearLayoutManager(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);
         }
     }
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class MyNestedScrollView extends NestedScrollView {
     private int downX;
     private int downY;
     private int mTouchSlop;
 
     public MyNestedScrollView(Context context) {
         super (context);
         mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
     }
 
     public MyNestedScrollView(Context context, AttributeSet attrs) {
         super (context, attrs);
         mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
     }
 
     public MyNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
         super (context, attrs, defStyleAttr);
         mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
     }
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent e) {
         int action = e.getAction();
         switch (action) {
             case MotionEvent.ACTION_DOWN:
                 downX = ( int ) e.getRawX();
                 downY = ( int ) e.getRawY();
                 break ;
             case MotionEvent.ACTION_MOVE:
                 int moveY = ( int ) e.getRawY();
                 if (Math.abs(moveY - downY) > mTouchSlop) {
                     return true ;
                 }
         }
         return super .onInterceptTouchEvent(e);
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值