利用字数计算weight,显示历史记录
效果如下:
涉及知识点
- ViewGroup
- JAVA中设置控件的布局属性
xml
- R.layout.order_history_row
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:paddingTop="6dp"
android:paddingLeft="6dp"
android:paddingRight="6dp">
</LinearLayout>
- R.layout.order_history_cell
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="6dp"
android:background="@drawable/bg_shape_order_cell"
android:textSize="16sp"
android:layout_marginRight="20dp"
android:textColor="@color/font_base"
android:singleLine="true"
android:ellipsize="end">
</TextView>
java
/*
*定制属于自己的历史记录
*/
protected void customizeView() {
ll_history.removeAllViews();
boolean IsLast = false;
//以i为下标遍历史记录数组mListstring[]
int i = 0;
// 当前屏幕的宽度像素值,高度heightPixels
WindowManager manager = this.getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int displayWidth = outMetrics.widthPixels;
//允许历史记录行最大宽度(除去padding)
displayWidth = displayWidth - dip2px(getApplicationContext(), 12);
while (!IsLast) {
/*
* 行View
*/
LinearLayout rowLinear = (LinearLayout) mInflater.inflate(
R.layout.order_history_row, null);
int currentWidth = 0;
/*
* 子View集合
*/
List<TextView> tv_list=new ArrayList<TextView>();
/*
* 子TextView的weight
*/
int[] tv_weight = new int[20];
for (; i < mListString.size(); i++) {
TextView textCell = (TextView) mInflater.inflate(
R.layout.order_history_cell, null);
final String text = mListString[i];
//跳过空值
if(text.equals("")) {
continue;
}
String textnext;
// 判断能否是否还有下一个历史记录
if (i + 1 < mListString.size()) {
textnext = mListString[i];
} else {
textnext = "";
}
textCell.setText(text);
//点击事件
textCell.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//搜索框的EditText
searchbar.getSearchEdit().setText(text);
//将EditText的光标置于最后
int Len = searchbar.getSearchEdit()
.getEditableText().toString().length();
searchbar.getSearchEdit().setSelection(Len);
getSearch(text);
}
});
// 计算内间距的像素值
int padding = dip2px(getApplicationContext(), 12);
// 计算当前历史记录的宽度
int fontSize = dip2px(getApplicationContext(), HISTORY_FONT_SIZE)
* text.length();
// 计算下一个历史记录的宽度,HISTORY_FONT_SIZE为字体大小(sp)
//HISTORY_PADDING_PX为历史记录间隔(px)
int fontSizeNext = dip2px(getApplicationContext(), HISTORY_FONT_SIZE)
* textnext.length();
currentWidth = currentWidth + padding + HISTORY_PADDING_PX
+ fontSize;
//保存tv信息
textCell.setGravity(Gravity.CENTER);
tv_list.add(textCell);
//记录每一个textCell的weight
tv_weight[tv_list.size()-1]=fontSize;
if ((currentWidth + fontSizeNext) > displayWidth) {
i++;
break;
}
}
/*
* 设置每个TextView的weight
*/
for (int j=0;j<tv_list.size();j++) {
LinearLayout.LayoutParams layoutparams = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
layoutparams.weight=tv_weight[j];
if(j==tv_list.size()-1) {
layoutparams.setMargins(0, 0, 0, 0);
}else {
layoutparams.setMargins(0, 0, HISTORY_PADDING_PX, 0);
}
rowLinear.addView(tv_list.get(j), layoutparams);
}
ll_history.addView(rowLinear);
if (i == mListDataHis.size()) {
IsLast = true;
}
}
}
/*
*将dp转化为px
*/
public int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}