1 package com.test.testview;
2
3 import java.util.ArrayList;
4
5 import android.content.Context;
6 import android.graphics.Color;
7 import android.text.TextUtils;
8 import android.util.AttributeSet;
9 import android.view.View;
10 import android.widget.LinearLayout;
11 import android.widget.TextView;
12
13 import com.test.testview.R;
14
15 public class HotwordsViewgroup extends LinearLayout implements
16 View.OnClickListener
17 {
18 private final static int VIEW_MARGIN_HORIZONTAL = 50;
19 private final static int VIEW_MARGIN_VERTICAL = 20;
20
21 private HotwordsOnclickListener mHotwordsOnclickListener;
22
23 public static interface HotwordsOnclickListener
24 {
25 /**
26 * 触发onclik回调,根据TextView.getText去做相关事情
27 *
28 * @param view
29 */
30 public void hotwordOnclick(TextView view);
31 }
32
33 public HotwordsViewgroup(Context context, AttributeSet attrs)
34 {
35 super(context, attrs);
36 init();
37 }
38
39 public HotwordsViewgroup(Context context, AttributeSet attrs, int defStyle)
40 {
41 super(context, attrs, defStyle);
42 init();
43 }
44
45 public HotwordsViewgroup(Context context)
46 {
47 super(context);
48 init();
49 }
50
51 /**
52 * 设置每个关键词点击事件监听
53 *
54 * @param listener
55 */
56 public void setHotwordOnclickListener(HotwordsOnclickListener listener) {
57 mHotwordsOnclickListener = listener;
58 }
59
60 private void init() {
61 setOrientation(HORIZONTAL);
62 }
63
64 public void setData(final ArrayList<String> list) {
65 removeAllViews();
66 if (list != null) {
67 for (int i = 0; i < list.size(); i++) {
68 String content = list.get(i);
69 if (TextUtils.isEmpty(content)) {
70 continue;
71 }
72 TextView textview = new TextView(getContext());
73 textview.setTextColor(Color.WHITE);
74 textview.setBackgroundResource(R.drawable.hot_words_bg);
75 textview.setTextSize(18);
76 textview.setOnClickListener(this);
77 textview.setMinimumWidth(100);
78 textview.setSingleLine();
79 textview.setEllipsize(TextUtils.TruncateAt.END);
80 textview.setText(content);
81 LinearLayout.LayoutParams layoutparams = new LinearLayout.LayoutParams(
82 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
83 addView(textview, layoutparams);
84 }
85 }
86 }
87
88 /**
89 * 重写onLayout,在layout每个元素之前,需要计算该元素是否需要折行到下一行显示
90 */
91 protected void onLayout(boolean changed, int l, int t, int r, int b) {
92 int count = getChildCount();
93 if (count == 0) {
94 super.onLayout(changed, l, count, r, b);
95 return;
96 }
97 int lengthX = 0;
98 int lengthY = 0;
99 for (int i = 0; i < count; i++) {
100 View child = getChildAt(i);
101 int width = child.getMeasuredWidth();
102 int height = child.getMeasuredHeight();
103 child.layout(lengthX, lengthY, lengthX + width, lengthY + height);
104 int right = lengthX + width + VIEW_MARGIN_HORIZONTAL;
105 int nextWidth = 0;
106 if (i < count - 1) {
107 nextWidth = getChildAt(i + 1).getMeasuredWidth();
108 }
109 if (right + nextWidth > (r - l)) {
110 lengthX = 0;
111 lengthY += height + VIEW_MARGIN_VERTICAL;
112 } else {
113 lengthX = right;
114 }
115 }
116 }
117
118 @Override
119 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
120 int count = getChildCount();
121 if (count == 0) {
122 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
123 return;
124 }
125 int lengthX = 0;
126 int lengthY = 0;
127 int r = MeasureSpec.getSize(widthMeasureSpec);
128 // 定义子View的宽度最大不能超过r宽度
129 int childWidth = MeasureSpec.makeMeasureSpec(r, MeasureSpec.AT_MOST);
130 for (int i = 0; i < getChildCount(); i++) {
131 View child = getChildAt(i);
132 child.measure(childWidth, MeasureSpec.UNSPECIFIED);
133 int width = child.getMeasuredWidth();
134 int height = child.getMeasuredHeight();
135 int right = lengthX + width + VIEW_MARGIN_HORIZONTAL;
136 int nextWidth = 0;
137 // 非最后一个元素需要尝试计算一下能否放的下
138 if (i < count - 1) {
139 nextWidth = getChildAt(i + 1).getMeasuredWidth();
140 } else {
141 // 最后一个计算高度的时候要加最后一排的高度
142 lengthY += height;
143 }
144 if (right + nextWidth > r) {
145 // 如果放不下,换行
146 lengthX = 0;
147 lengthY += height + VIEW_MARGIN_VERTICAL;
148 } else {
149 // 如果能放下,往后加
150 lengthX = right;
151 }
152 }
153 setMeasuredDimension(
154 widthMeasureSpec,
155 MeasureSpec.makeMeasureSpec(lengthY,
156 MeasureSpec.getMode(heightMeasureSpec)));
157 }
158
159 @Override
160 public void onClick(View view) {
161 if (mHotwordsOnclickListener != null) {
162 mHotwordsOnclickListener.hotwordOnclick((TextView) view);
163 }
164 }
165 }