Android搜索历史记录按权重显示

利用字数计算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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值