Android - 像标签一样堆叠物品

时间:2015-05-21 11:51:04

标签: android

我有什么:

enter image description here

我想做什么:

enter image description here

每当我添加项目时,我希望它放在前一个项目旁边。如果元素位于屏幕的末尾:我希望它放在下一行 类似于 CSS 中的float: left

2 个答案:

答案 0 :(得分:2)

如果您希望您的代码容器最终滚动,请使用RecyclerViewGridLayoutManager并调用setSpanCount(3)。不要忘记将其方向设置为VERTICAL

如果您不想让您的商品滚动,请使用GridLayout

编辑:

我把粗略的例子放在一起,以你想要的方式工作。你可能还需要考虑边距和填充,但它应该作为一个基本的想法如何做到这一点。

public class TagLayout extends ViewGroup {

public TagLayout(Context context) {
    super(context);
}

public TagLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public TagLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

public TagLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    int maxWidth = getMeasuredWidth();
    int count = getChildCount();

    int tagLeft = left,
        tagTop = top,
        tagRight = 0,
        tagBottom = 0;

    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() != GONE) {

            tagRight = tagLeft + child.getMeasuredWidth();
            tagBottom = tagTop + child.getMeasuredHeight();

            if (tagRight > maxWidth) {
                tagLeft = left;
                tagRight = left + child.getMeasuredWidth();
                tagTop = tagBottom;
                tagBottom += child.getMeasuredHeight();
            }
            child.layout(tagLeft, tagTop, tagRight, tagBottom);
            tagLeft = left;
        }

    }
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    int width = 0;
    int height = 0;
    int count = getChildCount();
    int maxWidth = MeasureSpec.getSize(widthMeasureSpec);

    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() != GONE) {
            measureChild(child, widthMeasureSpec, heightMeasureSpec);
            width += child.getMeasuredWidth();
            if (height == 0) {
                height += child.getMeasuredHeight();
            }
            if (width <= maxWidth) {
                continue;
            } else {
                width = 0;
                height += child.getMeasuredHeight();
            }
        }

    }
    setMeasuredDimension(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
}

}

答案 1 :(得分:1)

您需要的是像Java Swing FlowLayout这样的布局。您可以在网络上进行一些实施。这个图书馆很有前景,但我自己没试过。

Android FlowLayout

如果这对您不起作用,我将编辑并发布我使用的FlowLayout实现。我现在不能这样做,因为我离开了我的工作机器。