2015-08-21 96 views
0

是否有可能,我可以用另一个里面回收视图中回收的看法?回收站查看其他家长里回收站查看

我的要求是在一个屏幕上显示多个列表:

  • 垂直的3个项目

    列表
  • 的10项

    水平列表的5个扩展项目

  • 垂直列表

  • 同样的5项水平列表

所以,我想有一个MultiRecylerAdapter,将举行适配器其他recyler意见里面。

回答

3

我找到了解决方案。

我们可以插入回收视图(垂直或水平)的任何其它recyclerview内,但默认LinearLayoutManager不支持嵌入式再循环器视图的WRAP_CONTENT高度。

为了支持WRAP_CONTENT,我们应该用CustomLinearLayoutManager的一样。

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

完美的工作! –

0

UPDATE 2016年3月

通过的支持库版本的Android支持库23.2.1。所以所有的WRAP_CONTENT都应该正常工作。

请在更新的gradle文件库的版本。

compile 'com.android.support:recyclerview-v7:23.2.1' 

这允许RecyclerView根据其内容的大小自行调整大小。这意味着以前不可用的场景,例如对RecyclerView的维度使用WRAP_CONTENT,现在是可能的。

,你会被要求打电话

 setAutoMeasureEnabled(true) 

各种相关措施,规范方法,修正错误的更新

检查http://developer.android.com/intl/es/tools/support-library/features.html#v7-recyclerview

0

您可以使用一个RecyclerView withing另一个RecyclerView。但处理这种复杂的情况并不简单。创建适配器和管理不同的布局管理器似乎很复杂。 最好把RecyclerView放在一个ConstraintLayout/CoOrdinatorLayout中并实现ScrollView。这更容易。