2015-10-30 27 views
1

我有一个自定义水平RecyclerView它是在一个垂直列表视图。问题是,我无法在recyclerView中使用wrap_content。现在我正在设置455dp的高度。我也尝试了一种自定义的LinearLayoutManager,它修复了wrap_content问题,但随后,recyclerView不会水平滚动。水平RecyclerView高度包装内容不起作用

这里是我的自定义RecyclerView:

public class FlingRecyclerView extends RecyclerView { 

    int screenWidth; 

    public FlingRecyclerView(Context context) { 
     super(context); 
     WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 
     Display display = windowManager.getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     screenWidth = size.x; 
    } 

    public FlingRecyclerView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 
     Display display = windowManager.getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     screenWidth = size.x; 
    } 

    public FlingRecyclerView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 
     Display display = windowManager.getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     screenWidth = size.x; 
    } 

    @Override 
    public boolean fling(int velocityX, int velocityY) { 
     LinearLayoutManager linearLayoutManager = (LinearLayoutManager) getLayoutManager(); 

//these four variables identify the views you see on screen. 
     int lastVisibleView = linearLayoutManager.findLastVisibleItemPosition(); 
     int firstVisibleView = linearLayoutManager.findFirstVisibleItemPosition(); 
     View firstView = linearLayoutManager.findViewByPosition(firstVisibleView); 
     View lastView = linearLayoutManager.findViewByPosition(lastVisibleView); 

//these variables get the distance you need to scroll in order to center your views. 
//my views have variable sizes, so I need to calculate side margins separately. 
//note the subtle difference in how right and left margins are calculated, as well as 
//the resulting scroll distances. 


     int leftMargin = (screenWidth - lastView.getWidth())/2; 
     int rightMargin = (screenWidth - firstView.getWidth())/2 + firstView.getWidth(); 
     int leftEdge = lastView.getLeft(); 
     int rightEdge = firstView.getRight(); 
     int scrollDistanceLeft = leftEdge - leftMargin; 
     int scrollDistanceRight = rightMargin - rightEdge; 

//if(user swipes to the left) 
     if (velocityX > 0) smoothScrollBy(scrollDistanceLeft, 0); 
     else smoothScrollBy(-scrollDistanceRight, 0); 

     return true; 
    } 
} 

,这里是我的自定义布局管理器:

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++) { 
      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) { 
     View view = recycler.getViewForPosition(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); 
     } 
    } 
} 

可能是什么问题,如何解决?

+0

我经历了类似的问题。 RecyclerView不会在绘制其他文件后重新计算其大小。但可能有一个简单的解决方法。让我看看你的布局文件。 – Dpedrinha

+0

检查[RecyclerView上的WRAP_CONTENT](http://stackoverflow.com/a/35623177/2826147)回答。 –

+0

您是否可以使用答案中指定的新wrap_content修复此问题?因为我的回收站视图没有动态改变高度... [这是一个链接](http://stackoverflow.com/questions/41585286/horizo​​ntal-recyclerview-with-variable-item-heights-not-wrapping-properly)我的问题涉及到相同的 –

回答

1

WRAP_CONTENT in RecyclerView现在可以用Android Support Library 23.2.更新你的图库在gradle中。你可以找到更多的细节here