安卓中使用流式布局实现标签

我们在开发的时候通常需要加标签,对于这个标签怎么说呢,反正也挺复杂的,最初开发这个标签的时候还是没有思路的,后来在github上面查找了一下资料,了解了通过流式布局来实现这个标签,我记得开始的时候我写标签的时候是三个TextView一个一个添加进去的,后来感觉还是不太好,所以咯就用了流式布局来实现。看一下我的思路。第一步我在github上面找流式布局实现标签功能,找到了一个工具类感觉灰常好用所以就用了,看一下他的工具类


package com.redsun.property.widgets;

import android.content.Context;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.redsun.property.R;

/**
 * <Pre>
 * 元素自动换行容器
 * </Pre>
 *
 * @author zhangy
 * @version 1.0
 *          <p>
 *          Create by 14/11/12 下午6:22
 */
public class TagCloudLayout extends ViewGroup {
    private int mLineSpacing;
    private int mTagSpacing;
    private BaseAdapter mAdapter;
    private TagItemClickListener mListener;
    private DataChangeObserver mObserver;

    public TagCloudLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public TagCloudLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public TagCloudLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        TagCloudConfiguration config = new TagCloudConfiguration(context, attrs);
        mLineSpacing = config.getLineSpacing();
        mTagSpacing = config.getTagSpacing();
    }

    private void drawLayout() {
        if (mAdapter == null || mAdapter.getCount() == 0) {
            return;
        }

        this.removeAllViews();

        for (int i = 0; i < mAdapter.getCount(); i++) {
            View view = mAdapter.getView(i,null,null);
            final int position = i;
            view.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mListener != null) {
                        mListener.itemClick(position);
                    }
                }
            });
            this.addView(view);
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int wantHeight = 0;
        int wantWidth = resolveSize(0, widthMeasureSpec);
        int paddingLeft = getPaddingLeft();
        int paddingRight = getPaddingRight();
        int paddingTop = getPaddingTop();
        int paddingBottom = getPaddingBottom();
        int childLeft = paddingLeft;
        int childTop = paddingTop;
        int lineHeight = 0;

        //TODO 固定列的数量所需要的代码
        for (int i = 0; i < getChildCount(); i++) {
            final View childView = getChildAt(i);
            LayoutParams params = childView.getLayoutParams();
            childView.measure(
                    getChildMeasureSpec(widthMeasureSpec, paddingLeft + paddingRight, params.width),
                    getChildMeasureSpec(heightMeasureSpec, paddingTop + paddingBottom, params.height)
            );
            int childHeight = childView.getMeasuredHeight();
            int childWidth = childView.getMeasuredWidth();
            lineHeight = Math.max(childHeight, lineHeight);

            if (childLeft + childWidth + paddingRight > wantWidth) {
                childLeft = paddingLeft;
                childTop += mLineSpacing + childHeight;
                lineHeight = childHeight;
            }

            childLeft += childWidth + mTagSpacing;
        }
        wantHeight += childTop + lineHeight + paddingBottom;
        setMeasuredDimension(wantWidth, resolveSize(wantHeight, heightMeasureSpec));
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        //TODO 固定列的数量所需要的代码

        int width = r - l;
        int paddingLeft = getPaddingLeft();
        int paddingTop = getPaddingTop();
        int paddingRight = getPaddingRight();
        int childLeft = paddingLeft;
        int childTop = paddingTop;
        int lineHeight = 0;

        for (int i = 0; i < getChildCount(); i++) {
            final View childView = getChildAt(i);
            if (childView.getVisibility() == View.GONE) {
                continue;
            }
            int childWidth = childView.getMeasuredWidth();
            int childHeight = childView.getMeasuredHeight();
            lineHeight = Math.max(childHeight, lineHeight);

            if (childLeft + childWidth + paddingRight > width) {
                childLeft = paddingLeft;
                childTop += mLineSpacing + lineHeight;
                lineHeight = childHeight;
            }

            childView.layout(childLeft, childTop, childLeft + childWidth, childTop + childHeight);
            childLeft += childWidth + mTagSpacing;
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

    @Override
    public LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new LayoutParams(this.getContext(), attrs);
    }

    public void setAdapter(BaseAdapter adapter){
        if (mAdapter == null){
            mAdapter = adapter;
            if (mObserver == null){
                mObserver = new DataChangeObserver();
                mAdapter.registerDataSetObserver(mObserver);
            }
            drawLayout();
        }
    }

    public void setItemClickListener(TagItemClickListener mListener) {
        this.mListener = mListener;
    }

    public interface TagItemClickListener {
        void itemClick(int position);
    }

    class DataChangeObserver extends DataSetObserver {
        @Override
        public void onChanged() {
            TagCloudLayout.this.drawLayout();
        }

        @Override
        public void onInvalidated() {
            super.onInvalidated();
        }
    }
    public class TagCloudConfiguration {

        private static final int DEFAULT_LINE_SPACING = 5;
        private static final int DEFAULT_TAG_SPACING = 10;
        private static final int DEFAULT_FIXED_COLUMN_SIZE = 3; //默认列数

        private int lineSpacing;
        private int tagSpacing;
        private int columnSize;
        private boolean isFixed;

        public TagCloudConfiguration(Context context,AttributeSet attrs){
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TagCloudLayout);
            try {
                lineSpacing = a.getDimensionPixelSize(R.styleable.TagCloudLayout_lineSpacing, DEFAULT_LINE_SPACING);
                tagSpacing = a.getDimensionPixelSize(R.styleable.TagCloudLayout_tagSpacing, DEFAULT_TAG_SPACING);
                columnSize = a.getInteger(R.styleable.TagCloudLayout_columnSize, DEFAULT_FIXED_COLUMN_SIZE);
                isFixed = a.getBoolean(R.styleable.TagCloudLayout_isFixed,false);
            } finally {
                a.recycle();
            }
        }

        public int getLineSpacing() {
            return lineSpacing;
        }

        public void setLineSpacing(int lineSpacing) {
            this.lineSpacing = lineSpacing;
        }

        public int getTagSpacing() {
            return tagSpacing;
        }

        public void setTagSpacing(int tagSpacing) {
            this.tagSpacing = tagSpacing;
        }

        public int getColumnSize() {
            return columnSize;
        }

        public void setColumnSize(int columnSize) {
            this.columnSize = columnSize;
        }

        public boolean isFixed() {
            return isFixed;
        }

        public void setIsFixed(boolean isFixed) {
            this.isFixed = isFixed;
        }
    }
}
他的方法已经封装好了 所以我就直接用了,因为有时候开发就是知道怎么用网上的demo,咱们保证可以run起来就可以了,在微调微调。

<com.redsun.property.widgets.TagCloudLayout
    android:id="@+id/area_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="@dimen/spacing_small"
    android:layout_marginRight="@dimen/spacing_small"
    >


</com.redsun.property.widgets.TagCloudLayout>
这么用它的这个工具类,

holder.areaLayout.removeAllViews();
if (butlerEntity.getArealist() != null && butlerEntity.getArealist().size() > 0) {
    for (ButlerEntity.Area area : butlerEntity.getArealist()) {
        TextView text = new TextView(mct);
        ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        text.setTextColor(mct.getResources().getColor(R.color.butler_area_textcolor));
        text.setBackground(mct.getResources().getDrawable(R.drawable.bg_bulter_text));
        text.setText(area.getAreaname());
        lp.setMargins(140, 20, 140, 20);
        holder.areaLayout.addView(text, lp);
    }
} else {
    TextView text = new TextView(mct);
    ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    text.setText("暂无片区");
    holder.areaLayout.addView(text, lp);
}

return convertView;
之后就这样实现了它的功能这里需要注意一下

        ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
这个方法比不可少,否则就会报类型转换异常改工嗯呢该就实现了

 TextView text = new TextView(mct);
        ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        text.setTextColor(mct.getResources().getColor(R.color.butler_area_textcolor));
        text.setBackground(mct.getResources().getDrawable(R.drawable.bg_bulter_text));
        text.setText(area.getAreaname());
        lp.setMargins(140, 20, 140, 20);
        holder.areaLayout.addView(text, lp);
这几句就是调用它的核心代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值