3

我有一個RecyclerView作爲一個項目,在另一個垂直RecyclerView卡內。RecyclerView滾動和高度調節問題

我有滾動和調節兒童回收視圖高度(靈活高度)問題。

有沒有人遇到類似的問題?變通辦法?

+0

您使用的是什麼樣的支持libary? –

+0

如果你顯示你的代碼,我們可以更好地使用 –

回答

4

我的解決方案:所有的 首先設置你的孩子的回收視圖高度WRAP_CONTENT

<android.support.v7.widget.RecyclerView 
    android:id="@+id/child_recycler_view» 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

之後,你應該創建自定義佈局管理器類,從LinearLayoutManager擴展它和重寫onMeasure()和measureScrapChild()方法。

我的自定義類:

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

最後,設置你的孩子的回收佈局管理器已經創建MyLinearLayoutManager

MyLinearLayoutManager manager = new MyLinearLayoutManager(mContext,LinearLayoutManager.VERTICAL,false); 
holder.childList.setLayoutManager(manager); 
holder.childList.setNestedScrollingEnabled(false); 
holder.childList.setAdapter(adapter); 
+1

謝謝你的幫助了很多 –