public class MultiTextViewForTagBaikeSetPreference extends RelativeLayout {
private Context context;
private float textSize = 13;
private int textColor;
private int wordsMargin = 14;
private int wordMargin = 17;
private int lineMargin = 17;
// private int textPaddingLeft = 6;
// private int textPaddingRight = 6;
// private int textPaddingTop = 6;
// private int textPaddingBottom = 6;
// private int textBackground = R.drawable.frame_hotword;
private int textBackground;
private int layout_width;
// private int layout_height;
private OnMultipleTVItemClickListener listener;
public MultiTextViewForTagBaikeSetPreference(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MultiTextView);
int marginRight = ta.getDimensionPixelSize(R.styleable.MultiTextView_layout_marginRight, 0);
int marginLeft = ta.getDimensionPixelSize(R.styleable.MultiTextView_layout_marginLeft, 0);
int marginBottom = ta.getDimensionPixelOffset(R.styleable.MultiTextView_layout_marginBottom,0);
int marginTop= ta.getDimensionPixelOffset(R.styleable.MultiTextView_layout_marginTop,0);
UtilsLog.i("tvmar","R:"+marginRight + "L:"+marginLeft);
DisplayMetrics dm = getResources().getDisplayMetrics();
layout_width = dm.widthPixels;
// layout_height = dm.heightPixels;
textBackground = ta.getResourceId(R.styleable.MultiTextView_background, 0);
textColor = ta.getColor(R.styleable.MultiTextView_textColor, 0xFF333333);
ta.recycle();
layout_width = layout_width - marginRight - marginLeft;
// layout_height = layout_height + marginBottom + marginTop;
UtilsLog.i("tvW","layout_wid"+layout_width);
wordMargin = dip2px(context, wordsMargin);
lineMargin = dip2px(context, wordsMargin);
}
public void setOnMultipleTVItemClickListener(
OnMultipleTVItemClickListener listener) {
this.listener = listener;
}
public void setTextViews(ArrayList<String> dataList, boolean isChange) {
if (dataList == null || dataList.size() == 0) {
return;
}
if (getChildCount() > 0) {
removeAllViews();
}
// 每一行拉伸
int line = 0;
SparseArray<List<TextView>> lineMaps = new SparseArray<List<TextView>>();
lineMaps.put(0, new ArrayList<TextView>());
int x = 0;
int y = 0;
ArrayList<String> newList = new ArrayList<String>();
newList.addAll(dataList);
if (!isChange) {
if (newList.size() < 5) {
newList.add(dataList.size(), "可添加" + (5 - dataList.size()) + "个");
}
}
for (int i = 0; i < newList.size(); i++) {
String str = newList.get(i);
TextView tv = new TextView(context);
if (!isChange) {
if (i != newList.size() - 1) {
tv.setBackgroundResource(textBackground);
tv.setTextColor(textColor);
} else {
if (dataList.size() < 3) {
tv.setTextColor(Color.parseColor("#333333"));
tv.setBackgroundResource(R.drawable.bg_baike_add);
} else {
tv.setBackgroundResource(textBackground);
tv.setTextColor(textColor);
}
}
} else {
tv.setBackgroundResource(textBackground);
tv.setTextColor(textColor);
}
tv.setSingleLine();
tv.setGravity(Gravity.CENTER);
tv.setTextSize(textSize);
tv.setText(str);
tv.setTag(i);// 标记position
if (i != newList.size() - 1 || dataList.size() == 3 || isChange) {
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onMultipleTVItemClick(v,
(Integer) v.getTag());
}
}
});
}
int w = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
int h = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
tv.measure(w, h);
int tvh = tv.getMeasuredHeight();
int tvw = tv.getMeasuredWidth();
UtilsLog.i("tv",tvh+"h" + " w: "+tvw);
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
if (x + tvw > layout_width) {
x = 0;
y = y + tvh + lineMargin;
// 拉伸处理
line++;
lineMaps.put(line, new ArrayList<TextView>());
}
lp.leftMargin = x;
lp.topMargin = y;
x = x + tvw + wordMargin;
tv.setLayoutParams(lp);
// 拉伸处理
lineMaps.get(line).add(tv);
}
// 每一行拉伸
for (int i = 0; i <= line; i++) {
// 该行最后一个位置
for (int j = 0; j < lineMaps.get(i).size(); j++) {
TextView tView2 = lineMaps.get(i).get(j);
addView(tView2);
}
}
}
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
public interface OnMultipleTVItemClickListener {
public void onMultipleTVItemClick(View view, int position);
}
}
下面是XML部分代码
<com.suiluo.app.view.MultiTextViewForTagBaikeSetPreference
xmlns:widget="http://schemas.android.com/apk/res-auto"
android:id="@+id/mtv_list_tuijian"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:layout_marginTop="20dp"
widget:layout_marginLeft="14dp"
android:visibility="gone"
widget:background="@drawable/baike_frame_hotword"
widget:singleLine="false" />
如果高度设为固定高度,就会造成数据显示不全

假设本来十条数据,可以分多行显示,现在只能显示一行,其他的都看不见了。
求指教问题出在哪?
private Context context;
private float textSize = 13;
private int textColor;
private int wordsMargin = 14;
private int wordMargin = 17;
private int lineMargin = 17;
// private int textPaddingLeft = 6;
// private int textPaddingRight = 6;
// private int textPaddingTop = 6;
// private int textPaddingBottom = 6;
// private int textBackground = R.drawable.frame_hotword;
private int textBackground;
private int layout_width;
// private int layout_height;
private OnMultipleTVItemClickListener listener;
public MultiTextViewForTagBaikeSetPreference(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MultiTextView);
int marginRight = ta.getDimensionPixelSize(R.styleable.MultiTextView_layout_marginRight, 0);
int marginLeft = ta.getDimensionPixelSize(R.styleable.MultiTextView_layout_marginLeft, 0);
int marginBottom = ta.getDimensionPixelOffset(R.styleable.MultiTextView_layout_marginBottom,0);
int marginTop= ta.getDimensionPixelOffset(R.styleable.MultiTextView_layout_marginTop,0);
UtilsLog.i("tvmar","R:"+marginRight + "L:"+marginLeft);
DisplayMetrics dm = getResources().getDisplayMetrics();
layout_width = dm.widthPixels;
// layout_height = dm.heightPixels;
textBackground = ta.getResourceId(R.styleable.MultiTextView_background, 0);
textColor = ta.getColor(R.styleable.MultiTextView_textColor, 0xFF333333);
ta.recycle();
layout_width = layout_width - marginRight - marginLeft;
// layout_height = layout_height + marginBottom + marginTop;
UtilsLog.i("tvW","layout_wid"+layout_width);
wordMargin = dip2px(context, wordsMargin);
lineMargin = dip2px(context, wordsMargin);
}
public void setOnMultipleTVItemClickListener(
OnMultipleTVItemClickListener listener) {
this.listener = listener;
}
public void setTextViews(ArrayList<String> dataList, boolean isChange) {
if (dataList == null || dataList.size() == 0) {
return;
}
if (getChildCount() > 0) {
removeAllViews();
}
// 每一行拉伸
int line = 0;
SparseArray<List<TextView>> lineMaps = new SparseArray<List<TextView>>();
lineMaps.put(0, new ArrayList<TextView>());
int x = 0;
int y = 0;
ArrayList<String> newList = new ArrayList<String>();
newList.addAll(dataList);
if (!isChange) {
if (newList.size() < 5) {
newList.add(dataList.size(), "可添加" + (5 - dataList.size()) + "个");
}
}
for (int i = 0; i < newList.size(); i++) {
String str = newList.get(i);
TextView tv = new TextView(context);
if (!isChange) {
if (i != newList.size() - 1) {
tv.setBackgroundResource(textBackground);
tv.setTextColor(textColor);
} else {
if (dataList.size() < 3) {
tv.setTextColor(Color.parseColor("#333333"));
tv.setBackgroundResource(R.drawable.bg_baike_add);
} else {
tv.setBackgroundResource(textBackground);
tv.setTextColor(textColor);
}
}
} else {
tv.setBackgroundResource(textBackground);
tv.setTextColor(textColor);
}
tv.setSingleLine();
tv.setGravity(Gravity.CENTER);
tv.setTextSize(textSize);
tv.setText(str);
tv.setTag(i);// 标记position
if (i != newList.size() - 1 || dataList.size() == 3 || isChange) {
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onMultipleTVItemClick(v,
(Integer) v.getTag());
}
}
});
}
int w = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
int h = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
tv.measure(w, h);
int tvh = tv.getMeasuredHeight();
int tvw = tv.getMeasuredWidth();
UtilsLog.i("tv",tvh+"h" + " w: "+tvw);
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
if (x + tvw > layout_width) {
x = 0;
y = y + tvh + lineMargin;
// 拉伸处理
line++;
lineMaps.put(line, new ArrayList<TextView>());
}
lp.leftMargin = x;
lp.topMargin = y;
x = x + tvw + wordMargin;
tv.setLayoutParams(lp);
// 拉伸处理
lineMaps.get(line).add(tv);
}
// 每一行拉伸
for (int i = 0; i <= line; i++) {
// 该行最后一个位置
for (int j = 0; j < lineMaps.get(i).size(); j++) {
TextView tView2 = lineMaps.get(i).get(j);
addView(tView2);
}
}
}
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
public interface OnMultipleTVItemClickListener {
public void onMultipleTVItemClick(View view, int position);
}
}
下面是XML部分代码
<com.suiluo.app.view.MultiTextViewForTagBaikeSetPreference
xmlns:widget="http://schemas.android.com/apk/res-auto"
android:id="@+id/mtv_list_tuijian"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:layout_marginTop="20dp"
widget:layout_marginLeft="14dp"
android:visibility="gone"
widget:background="@drawable/baike_frame_hotword"
widget:singleLine="false" />
如果高度设为固定高度,就会造成数据显示不全

假设本来十条数据,可以分多行显示,现在只能显示一行,其他的都看不见了。
求指教问题出在哪?