适配器中TextView换行,显示内容不全,可以修改指这一列长和高,修改后是可以显示全的,可是不确定这列内容字的多少,有可能是10个,20个字,那么我修改了长在内容只有10个字的情况下,没问题。在20个字就又显示不全了,这个需要怎么设置或者好点方法

解决方案 »

  1.   

    一般listview中item高度是根据子view中最高的那个来的,动态修改了文字的话可以调用listview.requestlayout方法重新进行测量就好了,事实上调用adapter.notify*** 方法也会间接去重新测量
      

  2.   

    listview.requestlayout直接用吗?我写了,没有效果的。#1楼的方法是可以,不过不能这样做的。有没有方法把图片上Q/ 铺满在换行的方法或思路....
      

  3.   

    参考http://gundumw100.iteye.com/blog/1420725,我改了个自定义TextView ,楼主试试
    public class MyTextView extends TextView {
    private TextPaint mPaint = new TextPaint(); public MyTextView(Context context) {
    super(context);
    mPaint.setAntiAlias(true);
    } public MyTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mPaint.setAntiAlias(true);
    } @Override
    protected void onDraw(Canvas canvas) { float baseline = getTextSize() + 10;
    float x = 5;
    float y = baseline; // 由于系统基于字体的底部来绘制文本,所有需要加上字体的高度。
    mPaint.setTextSize(getTextSize());
    mPaint.setColor(getCurrentTextColor()); String txt = getText().toString();
    // 文本自动换行
    String[] texts = autoSplit(txt, mPaint, getWidth() -20);


    System.out.printf("line indexs: %s\n", Arrays.toString(texts)); for (String text : texts) {
    if (text == null)
    continue;
    canvas.drawText(text, x, y, mPaint); // 坐标以控件左上角为原点
    y += baseline; // 添加字体行间距
    }
    } /**
     * 自动分割文本
     * 
     * @param content
     *            需要分割的文本
     * @param p
     *            画笔,用来根据字体测量文本的宽度
     * @param width
     *            最大的可显示像素(一般为控件的宽度)
     * @return 一个字符串数组,保存每行的文本
     */
    private String[] autoSplit(String content, Paint p, float width) {
    int length = content.length();
    float textWidth = p.measureText(content);
    if (textWidth <= width) {
    return new String[] { content };
    } int start = 0, end = 1, i = 0;
    int lines = (int) Math.ceil(textWidth / width); // 计算行数
    String[] lineTexts = new String[lines];
    while (start < length) {
    if (p.measureText(content, start, end) > width) { // 文本宽度超出控件宽度时
    lineTexts[i++] = (String) content.subSequence(start, end);
    start = end;
    }
    if (end == length) { // 不足一行的文本
    lineTexts[i] = (String) content.subSequence(start, end);
    break;
    }
    end += 1;
    }
    return lineTexts;
    }
    }
      

  4.   

    谢谢了@Jing丶无双 ,NB呀!不过还有一点点瑕疵,就是这一列中内容能不能居中显示?
      

  5.   

    这个你自己计算一下 y轴的值吧,先通过getHeight()获取整个TextView的高度,然后再根据texts数组长度确定文字有多少行,而每行占用的高度是一样的,这样就能得到所有文字占用的高度。同样的道理x轴的值先通过getWidth()获取整个TextView的宽度,然后再根据情况计算,得到居中的(x,y)应该就不难喽。总之改变onDraw方法里面的逻辑,你想居中 ,居左,居右  都可以的,不过逻辑得你自己写
      

  6.   

    @ Jing丶无双  这个,我还是不太懂,才开始学的android,麻烦再问下,这一列内容可能有很多,我可以自己规定只让它显示几行吗?引用了,自己这样设置不行 android:maxLines="3", 是不是要在自定义的TextView中写呢?
      

  7.   

    这个行数也是在onDraw里面绘制出来的结果啊,你可以尝试屏蔽canvas.drawText这个方法,应该就没字了,总之现在文字是自己绘制出来的。你那个 android:maxLines="3"肯定没用的,你还是先自己去学习理解一下自定义控件吧,还有画布canvas