<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"`这里写代码片`
tools:context="com.example.lianxi_0902.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<EditText
android:id="@+id/edit_name"
android:layout_width="0dp"
android:layout_weight="8"
android:layout_height="match_parent"
android:hint="请输入关键字"
/>
<Button
android:id="@+id/add_btn"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="match_parent"
android:text="搜索"
/>
</LinearLayout>
<com.example.lianxi_0902.alex
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:tagSpacing="15dp"
app:lineSpacing="10dp"
></com.example.lianxi_0902.alex>
</LinearLayout>
===========================================以上是布局=================================
**重点内容****package com.example.lianxi_0902;
import android.graphics.drawable.DrawableContainer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.fyales.tagcloud.library.TagBaseAdapter;
import com.fyales.tagcloud.library.TagCloudLayout;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private alex container;
private EditText edit_name;
private Button add_btn;
private ArrayList<String> mList;
private TagBaseAdapter tagBaseAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
container = findViewById(R.id.container);
edit_name = findViewById(R.id.edit_name);
add_btn = findViewById(R.id.add_btn);
mList = new ArrayList<>();
mList.add("中华人民共和国");
mList.add("大韩民国");
mList.add("日本");
mList.add("朝鲜");
mList.add("台湾");
mList.add("香港特别行政区");
mList.add("澳门特别行政区");
mList.add("越南");
mList.add("老挝");
mList.add("柬埔寨");
mList.add("泰国");
mList.add("缅甸");
mList.add("马来西亚");
mList.add("新加坡");
mList.add("印度尼西亚");
mList.add("文莱");
mList.add("菲律宾");
tagBaseAdapter = new TagBaseAdapter(this, mList);
add_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = edit_name.getText().toString();
mList.add(s);
tagBaseAdapter.notifyDataSetChanged();
}
});
container.setAdapter(tagBaseAdapter);
container.setItemClickListener(new alex.TagItemClickListener() {
@Override
public void itemClick(int position) {
Toast.makeText(MainActivity.this,mList.get(position),Toast.LENGTH_SHORT).show();
}
});
}
}
=====================================源码alex===========================
package com.example.lianxi_0902;
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;
import com.fyales.tagcloud.library.TagCloudConfiguration;
import com.fyales.tagcloud.library.TagCloudLayout;
/**
* Created by Dell on 2018/9/2.
*/
public class alex extends ViewGroup{
private int mLineSpacing;
private int mTagSpacing;
private BaseAdapter mAdapter;
private alex.TagItemClickListener mListener;
private alex.DataChangeObserver mObserver;
public alex(Context context) {
super(context);
init(context, null, 0);
}
public alex(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public alex(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 View.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;
for (int i = 0; i < getChildCount(); i++) {
final View childView = getChildAt(i);
ViewGroup.LayoutParams params = childView.getLayoutParams();
childView.measure(
getChildMeasureSpec(widthMeasureSpec, paddingLeft + paddingRight, params.width),
getChildMeasureSpec(heightMeasureSpec, paddingTop + paddingBottom, params.height)
);
int childHeight = childView.getHeight();
int childWidth = childView.getWidth();
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) {
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);
int i = 0;
}
@Override
public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
return new ViewGroup.LayoutParams(this.getContext(), attrs);
}
public void setAdapter(BaseAdapter adapter){
if (mAdapter == null){
mAdapter = adapter;
if (mObserver == null){
mObserver = new alex.DataChangeObserver();
mAdapter.registerDataSetObserver(mObserver);
}
drawLayout();
}
}
public void setItemClickListener(alex.TagItemClickListener mListener) {
this.mListener = mListener;
}
public interface TagItemClickListener {
void itemClick(int position);
}
class DataChangeObserver extends DataSetObserver {
@Override
public void onChanged() {
alex.this.drawLayout();
}
@Override
public void onInvalidated() {
super.onInvalidated();
}
}
}