Макет запутался в ListView после прокрутки - PullRequest
0 голосов
/ 08 марта 2011

У меня есть ListView с пользовательским адаптером, который создает строки, содержащие TextView, которые могут содержать 1 или 2 строки текста.

news_row.xml:

<?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">

    <TextView android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="48dip"
        android:padding="6dp"
        android:textSize="14sp">
    </TextView>
</LinearLayout>

Адаптер:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.news_row, null);
    }
    else {
        TextView titleView = (TextView)convertView.findViewById(R.id.text);
        System.out.println(titleView.getText() + " to **" +
                stories.get(position).title);
    }

    TextView titleView = (TextView)convertView.findViewById(R.id.text);
    titleView.setText(stories.get(position).title);
    titleView.setGravity(Gravity.CENTER_VERTICAL);

    return convertView;
}

После прокрутки некоторые однострочные текстовые представления выглядят выровненными по верху строки, а некоторые двухстрочные текстовые представления находятся внизу строки. Кажется, проблема возникает, когда строке, в которой изначально содержалось 2-строчное TextView, дается одна строка текста, и наоборот.

Я думал, что установка Gravity в getView решит эту проблему с перезапуском строк, но это должно быть что-то другое. Что если я создаю TextView программно каждый раз, когда строка перерабатывается? Это то, что нужно, чтобы «сбросить» его?

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Представления строк повторно используются в listView.первые десять (я думаю, 10 или может быть меньше) раздуваются в первый раз, и размер / гравитация и т. д. установлены.Когда пользователи прокручивают ниже видимых строк, верхний ряд перерабатывается и подается в следующий следующий ряд.Таким образом, представление для самой верхней строки повторно используется для следующей следующей строки.Если ваш верхний ряд и следующий следующий ряд имеют разное количество строк, ожидаемое поведение ожидается.

Решение.Устанавливайте гравитацию текста и количество строк во время начального надувания, все ваши строки будут одинакового размера независимо от количества строк в них.Вы больше не должны видеть наблюдаемое вами колебание.

Подробнее см. В этом объяснении http://android.amberfog.com/?p=296

0 голосов
/ 23 марта 2011

Решение состояло в том, чтобы установить число строк textView (как сказал Veeresh), но не во время начального заполнения.

titleView.setLines(2);

Не совсем удовлетворительно (что, если у меня n строки?), И это даже не имеет смысла, учитывая, что высота textView уже установлена ​​явно в файле макета. Ну хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...