Динамическая высота для строки ListView в Android - PullRequest
6 голосов
/ 01 марта 2012

Я вижу странное поведение с моим ListView, которое я не могу обойти.

У меня есть ListView, который заполнен некоторыми данными. Каждая строка содержит изображение и три текстовые метки. Вот мой XML для строки (я надуваю его в методе getView Адаптера):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:paddingTop="0dip"
     android:paddingBottom="0dip"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">

    <ImageView android:id="@+id/Icon"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:padding="2dp"
        android:scaleType="fitCenter"
        android:contentDescription="@string/app_icon"/>

    <TextView android:id="@+id/TxtName"
         android:scrollHorizontally="false"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:textColor="@android:color/black"
         android:background="@color/list_bg1"
         android:layout_weight="2"
         android:padding="2dp"/>

     <TextView android:id="@+id/TxtPackage"
         android:scrollHorizontally="false"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:layout_weight="2"
         android:textColor="@android:color/black"
         android:background="@color/list_bg2"
         android:padding="2dp"/>

     <TextView android:id="@+id/TxtSource"
         android:scrollHorizontally="false"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:layout_weight="2"
         android:background="@color/list_bg3"
         android:textColor="@android:color/black"
         android:padding="2dp"/>
</LinearLayout>

Теперь все, что входит в текстовые поля, может иметь любую длину (от нескольких символов до 80-100 символов), и я хочу, чтобы надписи просто переносились, а высота строки увеличивалась в соответствии с высотой переноса. этикетки.

Тем не менее, ярлыки хорошо переносятся, но высота строки не увеличивается, поэтому нижняя часть ярлыков обрезается. Вот мой getView метод:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    SetInfo app = (SetInfo)getItem(position);
    if(app == null)
        return null;

    LinearLayout row = (LinearLayout) (convertView == null
               ? LayoutInflater.from(context).inflate(R.layout.listitem, parent, false)
               : convertView);
    ((TextView)row.findViewById(R.id.TxtName)).setText(app.getName());
    ((TextView)row.findViewById(R.id.TxtPackage)).setText(app.getPackage());
    ((TextView)row.findViewById(R.id.TxtSource)).setText(app.getSource());
    if(app.getIcon() != null)
        ((ImageView)row.findViewById(R.id.Icon)).setImageDrawable(app.getIcon());
    return row;
}

Как сделать так, чтобы строки были разной высоты и автоматически подстраивались под все содержимое?

Ответы [ 2 ]

8 голосов
/ 03 марта 2012

Попробуйте изменить ваши TextViews на Android: layout_height = "wrap_content".

4 голосов
/ 26 марта 2013

У меня была проблема с Сэмом, и ответ @ maebe мне не помог. Чтобы заставить его работать, я должен был вызвать requestLayout () для моего TextView в getView адаптера.

Итак, в вашем случае вам придется вызывать requestLayout () для каждого TextView:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    // Inflate your view etc.

    row.findViewById(R.id.TxtName).requestLayout();
    row.findViewById(R.id.TxtPackage).requestLayout();
    row.findViewById(R.id.TxtSource).requestLayout();
    return row;
}

Я перепробовал все виды трюков, и это единственный, который работал в моем случае.

...