android - 不同宽度的 RecyclerView

标签 android android-recyclerview

我想用始终具有相同高度但不同宽度的项目创建 RecyclerView。使用 Horizo​​ntal Recycler View 非常容易,但我想使用 Vertical Recycler View 来做到这一点。

结果应该是这样的:

 ___________________________________________
|                                           | 
|[................]  [......] [........]    |
|[......................]  [..............] |
|[.....]  [.................]               |
|[......................]  [......]         |
|                                           |
 -------------------------------------------

我怎样才能做到这一点?或者也许有比回收站 View 更好的东西?

最佳答案

使用 Doron Yakovlev-Golani 建议的方法,我在这个类中做到了:

public class LessonsLayoutManager extends StaggeredGridLayoutManager {

    private Point mMeasuredDimension = new Point();

    public LessonsLayoutManager() {
        super(2, HORIZONTAL);
    }

    @Override
    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
                          int widthSpec, int heightSpec) {

        final int widthSize = View.MeasureSpec.getSize(widthSpec) - (getPaddingRight() + getPaddingLeft());

        int width = 0;
        int height = 0;
        int row = 0;

        for (int i = 0; i < getItemCount(); i++) {

            if (!measureScrapChild(recycler, i,
                View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
                mMeasuredDimension)) continue;

            if (width + mMeasuredDimension.x > widthSize || mMeasuredDimension.x > widthSize) {
                row++;
                width = mMeasuredDimension.x;
            } else {
                width += mMeasuredDimension.x;
            }

            height += mMeasuredDimension.y;
        }

        setSpanCount(row);
        setMeasuredDimension(View.MeasureSpec.getSize(widthSpec), height);
    }

    @Override
    public boolean canScrollHorizontally() {
        return false;
    }

    @Override
    public boolean canScrollVertically() {
        return false;
    }

    private boolean measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, Point measuredDimension) {

        View view = null;
        try {
            view = recycler.getViewForPosition(position);
        } catch (Exception ex) {
            // try - catch is needed since support library version 24
        }

        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.set(
                view.getMeasuredWidth() + p.leftMargin + p.rightMargin,
                view.getMeasuredHeight() + p.bottomMargin + p.topMargin
            );

            recycler.recycleView(view);

            return true;
        }

        return false;
    }

}

结果是这样的:

enter image description here

关于android - 不同宽度的 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36115153/

相关文章:

java - Cordova captureImage 失败 FileNotFoundException

android - OpenGL ES 3.0 遮挡查询始终结果为 false

java - 我是否必须保留 `DEVICE_ID_EMULATOR` 作为广告的设备 ID

android - 尝试以编程方式执行单击不可见的 Recycler View 项时出现空指针异常

android - 如何在Android中制作Circular recyclerview(带有滚动的布局)?

java - 为什么我的数组值在回收器 View 中不起作用

android - Activity 什么时候完成自己的绘制?

android - 在 Kitkat (4.4) 中进入后台时如何识别应用程序?

java - Eclipse-以下类无法实例化: - android. support.v7.widget.RecyclerView

android - NestedScrolling with NestedScrollView, RecyclerView (Horizo​​ntal), inside a CoordinatorLayout