android 流式布局 选择器

本文介绍了一个基于Android的应用筛选界面实现方案,通过使用自定义组件TagCloudLayout实现学历、经验和薪资等多维度的标签筛选功能。

这里写图片描述

activity

import android.os.Bundle;
import android.view.View;

import com.zjb.qj.R;
import com.zjb.qj.presenter.BasePresenter;
import com.zjb.qj.view.base.BaseActivity;
import com.zjb.qj.view.widget.flow.TagBaseAdapter;
import com.zjb.qj.view.widget.flow.TagCloudBean;
import com.zjb.qj.view.widget.flow.TagCloudLayout;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.OnClick;


/**
 * 筛选
 */
public class ScreenActivity extends BaseActivity {

    @BindView(R.id.screen_flow_xl)
    TagCloudLayout screenFlowXl;
    @BindView(R.id.screen_flow_jy)
    TagCloudLayout screenFlowJy;
    @BindView(R.id.screen_flow_xs)
    TagCloudLayout screenFlowXs;
    private TagBaseAdapter mAdapterxl;
    private List<TagCloudBean> mListxl = new ArrayList<>();
    private TagBaseAdapter mAdapterjy;
    private List<TagCloudBean> mListjy = new ArrayList<>();
    private TagBaseAdapter mAdapterxs;
    private List<TagCloudBean> mListxs = new ArrayList<>();

    String[] xl = {"全部", "中专及以下", "高中", "大专", "本科", "硕士", "博士"};
    String[] jy = {"全部", "应届生", "1年内", "1-3年", "3-5年", "5-10年", "10年以上"};
    String[] xs = {"全部", "3k以下", "3k-5k", "5k-10k", "10k-20k", "20k-50k", "50k以上"};

    @Override
    protected int getLayoutResource() {
        return R.layout.activity_screen;
    }

    @Override
    protected BasePresenter[] createPresenter() {
        return new BasePresenter[0];
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initview();
    }

    @OnClick({R.id.screen_reset_tv, R.id.screen_confirm_tv})
    public void onViewClick(View v) {
        switch (v.getId()) {
            case R.id.screen_reset_tv:
                //重置
                createData(mListxl, xl);
                mAdapterxl.notifyDataSetChanged();
                createData(mListjy, jy);
                mAdapterjy.notifyDataSetChanged();
                createData(mListxs, xs);
                mAdapterxs.notifyDataSetChanged();
                break;
            case R.id.screen_confirm_tv:
                //确认
                finish();
                break;
        }
    }

    private void initview() {
//        学历
        mAdapterxl = new TagBaseAdapter(this, createData(mListxl, xl));
        screenFlowXl.setAdapter(mAdapterxl);
        screenFlowXl.setItemClickListener(position -> {
            changeState(mListxl, position);
            mAdapterxl.notifyDataSetChanged();
        });
//        经验
        mAdapterjy = new TagBaseAdapter(this, createData(mListjy, jy));
        screenFlowJy.setAdapter(mAdapterjy);
        screenFlowJy.setItemClickListener(position -> {
            changeState(mListjy, position);
            mAdapterjy.notifyDataSetChanged();
        });
//          薪资
        mAdapterxs = new TagBaseAdapter(this, createData(mListxs, xs));
        screenFlowXs.setAdapter(mAdapterxs);
        screenFlowXs.setItemClickListener(position -> {
            changeState(mListxs, position);
            mAdapterxs.notifyDataSetChanged();
        });
    }

    //    创建默认数据
    private List<TagCloudBean> createData(List<TagCloudBean> list, String[] array) {
        list.clear();
        for (int i = 0; i < array.length; i++) {
            TagCloudBean bean = new TagCloudBean();
            bean.setName(array[i]);
            if (i == 0) {
                bean.setState(true);
            } else {
                bean.setState(false);
            }
            list.add(bean);
        }
        return list;
    }

    //    选择状态改变
    private void changeState(List<TagCloudBean> list, int position) {
        if (list.get(position).isState()) {
            list.get(position).setState(false);
        } else {
            if (position == 0) {
                for (int i = 0; i < list.size(); i++) {
                    list.get(i).setState(false);
                }
                list.get(0).setState(true);
            } else {
                list.get(0).setState(false);
                list.get(position).setState(true);
            }
        }
    }

}
package com.zjb.qj.view.widget.flow;

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

/**
 * Created by zph on 2018/6/12.
 */

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

    /**
     * @param context
     * @param attrs
     */
    public TagCloudLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    /**

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

    /**
     * @param context
     * @param attrs
     * @param 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();
        }
    }
}
package com.zjb.qj.view.widget.flow;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;

import com.zjb.qj.R;

/**
 * Created by zph on 2018/6/12.
 */

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;
    }
}
package com.zjb.qj.view.widget.flow;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.zjb.qj.R;

import java.util.List;

/**
 * Created by zph on 2018/6/12.
 */

public class TagBaseAdapter extends BaseAdapter {

    private Context mContext;
    private List<TagCloudBean> mList;

    public TagBaseAdapter(Context context, List<TagCloudBean> list) {
        mContext = context;
        mList = list;
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public TagCloudBean getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_flow, null);
            holder = new ViewHolder();
            holder.tagBtn = (TextView) convertView.findViewById(R.id.item_flow_tv);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        String text = getItem(position).getName();
        holder.tagBtn.setText(text);
        Boolean state = getItem(position).isState();
        if (state) {
            holder.tagBtn.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.bg_flow_normal));
            holder.tagBtn.setTextColor(mContext.getResources().getColor(R.color.white));
        } else {
            holder.tagBtn.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.bg_flow));
            holder.tagBtn.setTextColor(mContext.getResources().getColor(R.color.flow_color));
        }
        return convertView;
    }

    static class ViewHolder {
        TextView tagBtn;
    }
}
package com.zjb.qj.view.widget.flow;

/**
 * Created by zph on 2018/6/13.
 */

public class TagCloudBean {

    private String name;//标签名
    private boolean state;//标签状态 是否选中


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isState() {
        return state;
    }

    public void setState(boolean state) {
        this.state = state;
    }

}
 <!--流式布局-->
    <declare-styleable name="TagCloudLayout">
        <attr name="lineSpacing" format="dimension" />
        <attr name="tagSpacing" format="dimension" />
        <!-- 是否是固定布局 -->
        <attr name="isFixed" format="boolean" />
        <attr name="columnSize" format="integer" />
    </declare-styleable>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魑魅魍魉9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值