解决ScrollView嵌套RecyclerView的冲突,非常简单,拿去可以直接用

来源:互联网 发布:深圳安健科技知乎 编辑:程序博客网 时间:2024/06/06 00:20
转载 连接 [这里写链接内容](http://blog.csdn.net/revival_liang/article/details/52201099)

建一个类

[html] view plain copy
print?
  1. package com.example.k.shoppingapp.Extend.Baby_Activity_Extend;  
  2.   
  3. import android.content.Context;  
  4. import android.support.v7.widget.LinearLayoutManager;  
  5. import android.support.v7.widget.RecyclerView;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9.   
  10. /**  
  11.  * Created by k on 2016/8/13.  
  12.  */  
  13. public class FullyLinearLayoutManager extends LinearLayoutManager {  
  14.   
  15.     private static final String TAG = FullyLinearLayoutManager.class.getSimpleName();  
  16.   
  17.     public FullyLinearLayoutManager(Context context) {  
  18.         super(context);  
  19.     }  
  20.   
  21.     public FullyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {  
  22.         super(context, orientation, reverseLayout);  
  23.     }  
  24.   
  25.     private int[] mMeasuredDimension = new int[2];  
  26.   
  27.     @Override  
  28.     public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,  
  29.                           int widthSpec, int heightSpec) {  
  30.   
  31.         final int widthMode = View.MeasureSpec.getMode(widthSpec);  
  32.         final int heightMode = View.MeasureSpec.getMode(heightSpec);  
  33.         final int widthSize = View.MeasureSpec.getSize(widthSpec);  
  34.         final int heightSize = View.MeasureSpec.getSize(heightSpec);  
  35.   
  36.         Log.i(TAG, “onMeasure called. \nwidthMode ” + widthMode  
  37.                 + ” \nheightMode ” + heightSpec  
  38.                 + ” \nwidthSize ” + widthSize  
  39.                 + ” \nheightSize ” + heightSize  
  40.                 + ” \ngetItemCount() ” + getItemCount());  
  41.   
  42.         int width = 0;  
  43.         int height = 0;  
  44.         for (int i = 0; i < getItemCount(); i++) {  
  45.             measureScrapChild(recycler, i,  
  46.                     View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),  
  47.                     View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),  
  48.                     mMeasuredDimension);  
  49.   
  50.             if (getOrientation() == HORIZONTAL) {  
  51.                 width = width + mMeasuredDimension[0];  
  52.                 if (i == 0) {  
  53.                     height = mMeasuredDimension[1];  
  54.                 }  
  55.             } else {  
  56.                 height = height + mMeasuredDimension[1];  
  57.                 if (i == 0) {  
  58.                     width = mMeasuredDimension[0];  
  59.                 }  
  60.             }  
  61.         }  
  62.         switch (widthMode) {  
  63.             case View.MeasureSpec.EXACTLY:  
  64.                 width = widthSize;  
  65.             case View.MeasureSpec.AT_MOST:  
  66.             case View.MeasureSpec.UNSPECIFIED:  
  67.         }  
  68.   
  69.         switch (heightMode) {  
  70.             case View.MeasureSpec.EXACTLY:  
  71.                 height = heightSize;  
  72.             case View.MeasureSpec.AT_MOST:  
  73.             case View.MeasureSpec.UNSPECIFIED:  
  74.         }  
  75.   
  76.         setMeasuredDimension(width, height);  
  77.     }  
  78.   
  79.     private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,  
  80.                                    int heightSpec, int[] measuredDimension) {  
  81.         try {  
  82.             View view = recycler.getViewForPosition(0);//fix 动态添加时报IndexOutOfBoundsException  
  83.   
  84.             if (view != null) {  
  85.                 RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();  
  86.   
  87.                 int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,  
  88.                         getPaddingLeft() + getPaddingRight(), p.width);  
  89.   
  90.                 int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,  
  91.                         getPaddingTop() + getPaddingBottom(), p.height);  
  92.   
  93.                 view.measure(childWidthSpec, childHeightSpec);  
  94.                 measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;  
  95.                 measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;  
  96.                 recycler.recycleView(view);  
  97.             }  
  98.         } catch (Exception e) {  
  99.             e.printStackTrace();  
  100.         } finally {  
  101.         }  
  102.     }  
  103. }  
package com.example.k.shoppingapp.Extend.Baby_Activity_Extend;import android.content.Context;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.View;import android.view.ViewGroup;/** * Created by k on 2016/8/13. */public class FullyLinearLayoutManager extends LinearLayoutManager {    private static final String TAG = FullyLinearLayoutManager.class.getSimpleName();    public FullyLinearLayoutManager(Context context) {        super(context);    }    public FullyLinearLayoutManager(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);        Log.i(TAG, "onMeasure called. \nwidthMode " + widthMode                + " \nheightMode " + heightSpec                + " \nwidthSize " + widthSize                + " \nheightSize " + heightSize                + " \ngetItemCount() " + getItemCount());        int width = 0;        int height = 0;        for (int i = 0; i < getItemCount(); i++) {            measureScrapChild(recycler, i,                    View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),                    View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),                    mMeasuredDimension);            if (getOrientation() == HORIZONTAL) {                width = width + mMeasuredDimension[0];                if (i == 0) {                    height = mMeasuredDimension[1];                }            } else {                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) {        try {            View view = recycler.getViewForPosition(0);//fix 动态添加时报IndexOutOfBoundsException            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);            }        } catch (Exception e) {            e.printStackTrace();        } finally {        }    }}

然后在代码里添加如下:

[html] view plain copy
print?
  1. FullyLinearLayoutManager linearLayoutManager = new FullyLinearLayoutManager(this);  
  2.         recyclerView.setNestedScrollingEnabled(false);  
  3.         //设置布局管理器  
  4.         recyclerView.setLayoutManager(linearLayoutManager);  
FullyLinearLayoutManager linearLayoutManager = new FullyLinearLayoutManager(this);一定不要忘了添加这行代码        recyclerView.setNestedScrollingEnabled(false);        //设置布局管理器        recyclerView.setLayoutManager(linearLayoutManager);


阅读全文
0 0
原创粉丝点击