自定义TextView,解决计算listView中item高度的时候,如果其中的TextView字数超过一行,只计算到一行高度的问题

    动态计算listView中item 的高度时,如果其中textview超过一行,只会计算其中第一行的刚度,(双层listview嵌套使用时经常出现这种问题)。我们需要自定义textview,动态计算textView的高度,具体代码如下

package com.example.wisdomoperating.view;

import android.app.Activity;
import android.content.Context;
import android.text.Layout;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * 
 * @author zhengaoyang 
 *自定义TextView,解决计算listViewitem高度的时候,如果其中的TextView字数超过一行,只计算到一行高度的问题
 */


public class myTextView extends TextView {

   private Context context;
   public myTextView(Context context) {
      super(context);
      // TODO Auto-generated constructor stub
      this.context = context;
   }
   public myTextView(Context context, AttributeSet attrs) {
      super(context, attrs);
      // TODO Auto-generated constructor stub
      this.context = context;
   }
   public myTextView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      // TODO Auto-generated constructor stub
      this.context = context;
   }

   
   

   
   
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       super.onMeasure(widthMeasureSpec, heightMeasureSpec);

       Layout layout = getLayout();
       if (layout != null) {
           int height = (int)FloatMath.ceil(getMaxLineHeight(this.getText().toString()))
                   + getCompoundPaddingTop() + getCompoundPaddingBottom();
           int width = getMeasuredWidth();            
           setMeasuredDimension(width, height);
       }
   }

   private float getMaxLineHeight(String str) {
      float height = 0.0f;
      float screenW = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth();
      float paddingLeft = ((LinearLayout)this.getParent()).getPaddingLeft();
      float paddingReft = ((LinearLayout)this.getParent()).getPaddingRight();
//这里具体this.getPaint()要注意使用,要看你的TextView在什么位置,这个是拿TextView父控件的Padding的,为了更准确的算出换行
 int line = (int) Math.ceil( (this.getPaint().measureText(str)/(screenW-paddingLeft-paddingReft))); 
 height = (this.getPaint().getFontMetrics().descent-this.getPaint().getFontMetrics().ascent)*line; return height;}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
ListView一行嵌套TextView是一种常见的布局方式,通常用于展示列表信息。您可以通过使用适配器(Adapter)来为ListView提供数据,并在getView()方法设置每一行的布局。 以下是一个示例代码: ``` public class MyAdapter extends BaseAdapter { private List<String> mData; public MyAdapter(List<String> data) { this.mData = data; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); holder = new ViewHolder(); holder.textView = convertView.findViewById(R.id.tv_item); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.textView.setText(mData.get(position)); return convertView; } static class ViewHolder { TextView textView; } } ``` 在上述代码,适配器MyAdapter继承自BaseAdapter,并在getView()方法设置每一行的布局。每一行的布局文件list_item.xml包含一个TextView,用来展示数据。 在Activity,您可以将ListView与适配器关联起来,如下所示: ``` ListView listView = findViewById(R.id.list_view); MyAdapter adapter = new MyAdapter(data); listView.setAdapter(adapter); ``` 其,data是一个String类型的列表,包含了要展示的数据。通过调用ListView的setAdapter()方法,将适配器与ListView关联起来,即可在界面上展示出ListView一行嵌套TextView的布局。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值