Неизвестное поведение ListView

В настоящее время я делаю SMS-приложение на Android, ниже приведен фрагмент кода из Inbox Listactivity, я запросил курсор из ContentResolver и использовал пользовательский адаптер для добавления пользовательских представлений в список.

Теперь в пользовательском представлении у меня есть 2 TextViews (tvFullBody, tvBody)... tvFullBody содержит полный текст SMS, а tvBody содержит краткий предварительный просмотр (35 символов). Для параметра видимости tvFullBody по умолчанию установлено значение GONE.

Моя идея заключается в том, что когда пользователь щелкает элемент списка, tvBody должен исчезнуть (GONE), а tvFullBody должен стать видимым (VISIBLE). При повторном нажатии он должен вернуться в исходное состояние.

//isExpanded is a BitSet of the size = no of list items...keeps track of which items are expanded and which are not

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {

    if(isExpanded.get(position))
    {
        v.findViewById(R.id.tvFullBody).setVisibility(View.GONE);
        v.findViewById(R.id.tvBody).setVisibility(View.VISIBLE);
    }else
    {
        v.findViewById(R.id.tvFullBody).setVisibility(View.VISIBLE);
        v.findViewById(R.id.tvBody).setVisibility(View.GONE);
    }
    isExpanded.flip(position);
    super.onListItemClick(l, v, position, id);
}

Код работает так, как и предполагалось :) за исключением нежелательного побочного эффекта... Каждый 10-й (или около того) элемент списка также "переключается". например. Если я разверну 1-й, то 11-й, 21-й элементы списка также будут расширены ... Хотя они остаются за пределами экрана, но при прокрутке вы увидите нежелательное «расширение».

По моему анализу новичков, я предполагаю, что Listview отслеживает 10 элементов списка, которые в настоящее время видны, при прокрутке он «повторно использует» те же самые переменные, которые вызывают эту проблему... (я не проверял исходный код Android пока.) Я был бы признателен за любое предложение о том, как мне решить эту проблему! :) Я также открыт для альтернативных методов.... Заранее спасибо! :)


person st0le    schedule 17.06.2010    source источник


Ответы (1)


Ваш диагноз проблемы почти правильный. Происходит то, что Android повторно использует представления, которые он создает, для отображения списка для экономии памяти. Вместо того, чтобы создавать новое представление для каждого элемента в вашем списке, Android создает ровно столько, чтобы заполнить экран, обновляя их, чтобы отображать соответствующие данные для элементов, которые в данный момент видны.

Поэтому, когда вы показываете tvFullBody, когда пользователь нажимает на элемент, когда этот вид повторно используется позже, tvFullBody все еще отображается.

Возможно, вам придется написать собственное ListAdapter, чтобы представления отображались так, как вы хотите. Это должно быть так же просто, как расширение ListAdapter, которое вы используете в настоящее время, и переопределение метод getView(), чтобы убедиться, что tvFullBody скрыто.

person Dave Webb    schedule 17.06.2010
comment
Это было сложно, но мне удалось заставить это работать :) Спасибо, что указали мне правильное направление! - person st0le; 17.06.2010