强制 RecyclerView 位于布局中的页面底部

2024-04-02

我有一个页面,其中包含ImageView, and a RecyclerView. The RecyclerView包含少量项目(当前为三个),并且仅占用我的测试设备上屏幕的四分之一左右。然而,尽管尝试了多种布局选项,我还是无法得到RecyclerView有效地包装其内容并占用包含这三行所需的足够空间,并将其余空间留给我的ImageView.

为了帮助说明我的意思,我画了两张图。第一个显示我希望发生的情况,第二个显示正在发生的情况:

到目前为止,我已经尝试了几种不同的组合RelativeLayout- 例如,我将设置RecyclerView to layout:align_ParentBottom和第二个RelativeLayout其中包含ImageView to layout:alignComponent使其底部与RecyclerView顶部(这通常会拖动ImageView布局,以便它填充任何剩余空间,这就是我希望发生的情况。)

The RecyclerView尽管它只包含几行,但它仍然占据了尽可能多的空间。我当前的“解决方案”是将所有内容都放在一个LinearLayout并设置较少gravity to the RecyclerView,但它并不理想,因为在不同的模拟器上它不会与屏幕底部完全对齐,而在其他模拟器上则没有足够的空间和RecyclerView变得可滚动。

预先感谢任何人可以提供的任何帮助和建议。


非常感谢每个做出贡献的人,但我已经找到了一个程序化的解决方案之外layout文件。如果其他人正在寻找解决此问题的方法,我找到了一个here https://stackoverflow.com/questions/26649406/nested-recycler-view-height-doesnt-wrap-its-content.

似乎有问题RecyclerView目前它不包装内容。答案是构造一个扩展的自定义类LinearLayoutManager。我在下面发布了对我有用的解决方案 - 大部分内容是从我引用的链接中给出的答案复制并粘贴的。唯一的小问题是它没有考虑装饰添加的额外空间,这就是为什么我必须对代码末尾附近的以下行进行小调整:

//I added the =2 at the end.    
measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin + 2;

这是完整的代码:

public class HomeLinearLayoutManager extends LinearLayoutManager{

    HomeLinearLayoutManager(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 + 2;
            recycler.recycleView(view);
        }
    }
}

再次感谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制 RecyclerView 位于布局中的页面底部 的相关文章

随机推荐