Конфликт действий Android в onResume () и onActivityResult () - PullRequest
2 голосов
/ 12 января 2012

Есть проблема.В моей основной деятельности у меня есть ListView.И мне нужно обновлять его каждый раз, когда я возвращаюсь к этому занятию.Для этого я использую метод onResume ():

@Override
protected void onResume() {
    super.onResume();
    refreshCategoriesList();
}

private void refreshCategoriesList() {
        // ...
        categoriesListAdapter = new CategoryListItemAdapter(
            this, R.layout.category_item,
            categories
        );
        categoriesListView.setAdapter(categoriesListAdapter);
}

Как видите, я использую адаптер обновления, расширенный от ArrayAdapter, для изменения данных в ListView.

Но в некоторых случаях мне нужно прокрутить этот списокдо конца, например.когда я добавляю новый предмет к нему.И я использую метод onActivityResult (...) для этого:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // ...
        refreshCategoriesList();

        categoriesListView.setSelection(categoriesListAdapter.getCount() - 1);
}

Но у меня есть одна проблема.Когда я добавляю новый элемент в мой список, оба эти метода выполняются в порядке onActivityResult (...) и после этого onResume ().И у меня есть:

  1. Данные списка обновляются до времен с помощью refreshCategoriesList () (но это не главная проблема);
  2. После выполнения onResume () прокручивается до конечного списка, восстановленного до первого элементаposition :( Это проблема. Потому что, когда я добавляю новый элемент, мне нужен список прокрутки до конца.

Как я могу решить эту проблему. Могу ли я в некоторых случаях вызывать только onActivityResult (...)метод (когда мне нужно прокрутить список) и другой метод onResume () (когда я просто хочу обновить данные списка)?

1 Ответ

2 голосов
/ 08 мая 2012

Вы можете использовать метод notifyDataSetChanged () из ArrayAdapter вместо пересоздания адаптера каждый раз.

private void refreshCategoriesList() {
    categoriesListAdapter.notifyDataSetChanged();
}
...