带有TextView的ListView只包含包装的文本

时间:2016-11-09 16:06:43

标签: android android-layout listview

我有一个LinearLayout,顶部是标题TextView,然后是一个包含TextViews的ListView。这是另一个类似的LinearLayout,其中包含GridView。

ListView中的TextViews不会居中,除非由于篇幅较长而文本换行。

当我硬连接ListView的宽度时,我确实让它们居中,但是这有另一个副作用,即文本在长行的两端被切断,即使它被包裹。只是没有正确包装。所以我通过将硬编码宽度移动到封闭的LinearLayout来解决这个问题,但现在遇到了这个问题。

一个有趣的说明是,我的类似GridView似乎没有问题,虽然它也有一个'background drawable',这是一个带圆角的矩形。

布局是:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:weightSum="3">

    <LinearLayout
        android:id="@+id/course_part"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/course"
            android:textSize="@dimen/text_course_title"
            android:textColor="#ff000000"
            android:textStyle="bold" />

        <ListView
            android:id="@+id/listview_course"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"/>
    </LinearLayout>

填充ListView的TextView是:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/list_item_mark_name_name"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:fontFamily="Roboto"
      android:textAlignment="center"
      android:text="name"
      android:textColor="#ff000000"
      android:textSize="@dimen/text_course_grid"
      android:textStyle="bold"
      android:typeface="monospace"
/>

我应该注意,我根据文本的长度动态更改ArrayAdapter'getView'中的字体大小:

    // First shrink it's size to better fit.
    float textSize = 30;    // In DP units.
    int nameLength = mark.name.length();
    if (nameLength > 4)
    {
        if (nameLength <= 8)
            textSize *= 4.0f / nameLength;  // Up to 8, proportionally shrink it.
        else
            textSize *= 0.5f;               // After 8, leave it at half size.
    }

    holder.textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize);
    holder.textView.setMinHeight(this.textViewPixels);
    holder.textView.setText(mark.name); // Set it's name.
    holder.textView.setTextColor(appData.getNightMode() ? Color.WHITE : Color.BLACK);  // Just added it.  Set it's color properly.

我尝试过gravity =“center”和textAlignment =“center”,它们的行为都相同。

我已经尝试了各种包含视图/布局的match_parent和fill_parent的各种组合,结果通常很糟糕,如果我没有硬连接宽度,我会得到太多空间或非常薄的无用列。

谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方法:只需将封闭的LinearLayout更改为RelativeLayout。

为什么这个工作是个好问题。闻起来像是图书馆里的一个小虫。

所以这是我更新的布局,略有改动,以使标题TextView居中。没有更改ListView中使用的TextView。

    <RelativeLayout
        android:id="@+id/course_part"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/course_course_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/course"
            android:gravity="center"
            android:textSize="@dimen/text_course_title"
            android:textColor="#ff000000"
            android:textStyle="bold" />

        <ListView
            android:id="@+id/listview_course"
            android:layout_below="@id/course_course_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"/>
    </RelativeLayout>