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))`