为了账号安全,请及时绑定邮箱和手机立即绑定

嵌套的Recycler视图高度不会包装其内容

嵌套的Recycler视图高度不会包装其内容

MMTTMM 2019-07-23 16:47:20
嵌套的Recycler视图高度不会包装其内容我有一个应用程序来管理书籍集(如播放列表)。我想显示一个带有垂直RecyclerView的集合列表,并在每行内部显示一个水平RecyclerView中的书籍列表。当我将内部水平RecyclerView的layout_height设置为300dp时,它会正确显示,但是当我将其设置为wrap_content时,它不会显示任何内容。 我需要使用wrap_content,因为我希望能够以编程方式更改布局管理器以在垂直和水平显示之间切换。你知道我做错了什么吗?我的片段布局:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:background="@color/white">     <com.twibit.ui.view.CustomSwipeToRefreshLayout         android:id="@+id/swipe_container"         android:layout_width="match_parent"         android:layout_height="match_parent">         <LinearLayout             android:layout_width="match_parent"             android:layout_height="match_parent"             android:orientation="vertical">             <android.support.v7.widget.RecyclerView                 android:id="@+id/shelf_collection_listview"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:paddingTop="10dp"/>         </LinearLayout>     </com.twibit.ui.view.CustomSwipeToRefreshLayout></LinearLayout>集合元素布局:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:layout_width="match_parent"               android:layout_height="wrap_content"               android:orientation="vertical">     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"                     android:layout_width="match_parent"                     android:layout_height="wrap_content"                     android:background="#FFF">         <!-- Simple Header -->     </RelativeLayout>     <FrameLayout         android:layout_width="match_parent"         android:layout_height="wrap_content">
查看完整描述

3 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

方向和动态数据更改的完整解决方法是:

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


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 615 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信