androidtag标签效果

来源:互联网 发布:淘宝特卖2016女装 编辑:程序博客网 时间:2024/05/16 11:31

TagFlowLayout类

public class TagFlowLayout : ViewGroup    {        private int mLineSpacing=16;         private int mTagSpacing=16;         private BaseAdapter mAdapter;        private Android.Database.DataSetObserver mObserver;         public TagFlowLayout (Context context):base(context){        }        public TagFlowLayout(Context context, IAttributeSet attrs):base(context,attrs){        }        public TagFlowLayout(Context context, IAttributeSet attrs, int defStyle):base(context,attrs,defStyle) {        }        public void drawLayout() {             if (mAdapter == null || mAdapter.Count == 0) {                return;            }            this.RemoveAllViews ();            for (int i = 0; i < mAdapter.Count; i++) {                View view = mAdapter.GetView(i,null,null);                int position = i;                this.AddView(view);            }        }        protected override void OnMeasure (int widthMeasureSpec, int heightMeasureSpec)        {            //base.OnMeasure (widthMeasureSpec, heightMeasureSpec);            int wantHeight = 0;            int wantWidth=View.ResolveSize(0,widthMeasureSpec);            int paddingLeft = this.PaddingLeft;            int paddingRight = this.PaddingRight;            int paddingTop = this.PaddingTop;            int paddingBottom = this.PaddingBottom;            int childLeft = paddingLeft;            int childTop = paddingTop;            int lineHeight = 0;            for (int i = 0; i <this.ChildCount; i++) {                 View childView=this.GetChildAt(i);                if (childView.Visibility == ViewStates.Gone) {                    continue;                }                LayoutParams paramss = childView.LayoutParameters;                childView.Measure(GetChildMeasureSpec(widthMeasureSpec, paddingLeft + paddingRight, paramss.Width),GetChildMeasureSpec(heightMeasureSpec, paddingTop + paddingBottom, paramss.Height)                );                int childHeight = childView.Height;                int childWidth = childView.Width;                lineHeight = Math.Max(childHeight, lineHeight);                if (childLeft + childWidth + paddingRight > wantWidth) {                    childLeft = paddingLeft;                    childTop += mLineSpacing + childHeight;                    lineHeight = childHeight;                } else {                    childLeft += childWidth + mTagSpacing;                }            }            wantHeight = childTop + lineHeight + paddingBottom;            SetMeasuredDimension (wantWidth, ResolveSize (wantHeight, heightMeasureSpec));        }        protected override void OnLayout (bool changed, int l, int t, int r, int b)        {            int width = r - l;            int paddingLeft = this.PaddingLeft;            int paddingTop = this.PaddingTop;            int paddingRight = this.PaddingRight;            int childLeft = paddingLeft;            int childTop = paddingTop;            int lineHeight = 0;            for (int i = 0, childCount = ChildCount; i < childCount; ++i) {                 View childView =GetChildAt(i);                if (childView.Visibility == ViewStates.Gone) {                    continue;                }                int childWidth = childView.MeasuredWidth;                int childHeight = childView.MeasuredHeight;                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;            }        }        protected override void OnDraw (Android.Graphics.Canvas canvas)        {            base.OnDraw (canvas);        }        protected override LayoutParams GenerateDefaultLayoutParams ()        {            return base.GenerateDefaultLayoutParams ();        }        public void setAdapter(BaseAdapter adapter){            if (mAdapter == null) {                mAdapter = adapter;                if (mObserver == null) {                    mObserver = new DataChangeObserver(this);                    mAdapter.RegisterDataSetObserver(mObserver);                }                drawLayout();            }        }    }

DataChangeObserver类

class DataChangeObserver:Android.Database.DataSetObserver{        TagFlowLayout tagflowlayout;        public DataChangeObserver(TagFlowLayout tagflowlayout)        {            this.tagflowlayout = tagflowlayout;        }        public override void OnChanged ()        {            base.OnChanged ();            tagflowlayout.drawLayout ();        }        public override void OnInvalidated ()        {            base.OnInvalidated ();        }    }

TagBaseAdapter类

public class TagBaseAdapter : BaseAdapter    {        private Context mContext;         private List<String> mList;         public TagBaseAdapter(Context context, List<String> list) {            this.mContext = context;            this.mList = list;        }        public override int Count {            get {                return mList.Count;            }        }        public override Java.Lang.Object GetItem (int position)        {            return mList [position];        }        public override long GetItemId (int position)        {            return position;        }        public override View GetView (int position, View convertView, ViewGroup parent)        {            ViewHolder holder;            if (convertView == null) {                convertView = LayoutInflater.From (mContext).Inflate (Resource.Layout.tagView, null);                holder = new ViewHolder ();                holder.tagBtn = (Button)convertView.FindViewById (Resource.Id.tag_btn);                convertView.Tag = holder;            } else {                holder = (ViewHolder)convertView.Tag;            }            String text = mList[position];             holder.tagBtn.Text = text;            return convertView;         }    }

Viewholder类

class ViewHolder:Java.Lang.Object    {        public Button tagBtn;     }

界面

<RelativeLayout                        android:minWidth="25px"                        android:minHeight="25px"                        android:layout_width="match_parent"                        android:layout_height="wrap_content"                        android:id="@+id/relativeLayout1">                        <com.ixiaomang.TagFlowLayout                            android:id="@+id/container"                            android:layout_width="match_parent"                            android:paddingTop="5dp"                            android:paddingBottom="5dp"                            android:layout_height="wrap_content" />                    </RelativeLayout>

mainactivity中主要代码

List<string> taglist= new List<string> (){"可爱","大懒虫","很认证","二货","超级有责任心","呆萌+2" };            mContainer = (TagFlowLayout) FindViewById(Resource.Id.container);            mAdapter = new TagBaseAdapter(this,taglist);            mContainer.setAdapter(mAdapter))`
0 0