解決ScrollView嵌套RecyclerView的衝突,非常簡單,拿去可以直接用

轉載 連接 [這裏寫鏈接內容](http://blog.csdn.net/revival_liang/article/details/52201099)

建一個類

  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 {
        }
    }
}

然後在代碼裏添加如下:

  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);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章