ListvView в виджете на главном экране иногда показывает старые (кешированные?) данные

У меня есть виджет домашнего экрана с ListView внутри (Android 4.x - ICS), и после некоторых изменений перечисленные элементы отображаются неправильно - я имею в виду, отображаются "старые" данные. Всегда так:

  1. видимая часть списка ВСЕГДА отображает хорошие (= новые) данные
  2. невидимая часть списка (прокрутка вверх или вниз) ВСЕГДА показывает некоторые элементы старые (а некоторые нет)

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

В чем проблема? Вот мой ListView:

<ListView
    android:id="@+id/panelNews"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_marginLeft="@dimen/padding"
    android:layout_marginRight="@dimen/padding"
    android:layout_weight="1"
    android:gravity="top"
    android:paddingTop="@dimen/padding"
    android:scrollingCache="false"
    android:animationCache="false">
</ListView>

А вот код моего метода MyWidgetServiceFactory (этот метод срабатывает при каждом изменении данных):

public void onDataSetChanged() {
    MyLogger.log(TAG, "onDataSetChanged");
    listItems = dbHandler.getRecords(prefHandler);
}

И вот как я уведомляю MyWidgetServiceFactory об изменении данных из моего UpdateService:

AppWidgetManager manager = AppWidgetManager.getInstance(this);
int[] appWidgetIds = manager.getAppWidgetIds(new ComponentName(this, MyWidget.class));
manager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.panelNews);

person qkx    schedule 15.08.2012    source источник


Ответы (2)


Вы должны использовать функцию

notifyDataSetChanged()

вызывается адаптером, который вы используете для заполнения списка. Перейдите по этой ссылке для получения дополнительной информации.

person sinisha    schedule 15.08.2012
comment
Я уведомляю об изменении данных - см. последние несколько строк обновленного вопроса. PS: ListView на главном экране не имеет адаптера, а RemoteViewsService и RemoteViewsServiceFactory. - person qkx; 15.08.2012

хорошо, полностью моя вина, это была глупая ошибка - я просто забыл обновить 1 поле.

person qkx    schedule 15.08.2012