Как сохранить и восстановить позицию ListView в Android - PullRequest
6 голосов
/ 24 августа 2011

У меня есть tabView, отображающий список на каждой вкладке.Когда я прокручиваю одну вкладку, переключаюсь на другую вкладку и возвращаюсь к предыдущей вкладке, позиция возвращается наверх вместо отображения предыдущей прокрученной позиции.Как мне этого добиться?Нужно знать, как использовать onSaveInstanceState & onRestoreInstanceState для сохранения позиции и использовать сохраненную позицию при отображении предыдущей прокручиваемой позиции.

Заранее спасибо.


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

У меня в качестве первого действия при первом запуске приложения отображается список.Когда я нажимаю на элемент списка, он запускает вкладку, содержащую 3 вкладки.На всех 3 вкладках используется одно и то же действие под названием ListActivity.Но 3 вкладки содержат разные данные.Мой вопрос заключается в том, как сохранить положение списка, когда я переключаюсь между вкладками.Благодаря предоставленным выше решениям, когда я меняю положение на одной вкладке, это влияет и на остальные вкладки.Например, если я нахожусь в позиции 6 на первой вкладке, эта позиция будет установлена ​​для второй и третьей вкладок, а также я использую одну и ту же ListActivity для всех 3 вкладок.Мне не разрешено делиться кодом.Так что нужно напечатать проблему так долго.Также количество созданных вкладок является динамическим.Это может быть 3, 4 или 5. Но все вкладки используют 1 ListActivity.

Может кто-нибудь дать мне пример, как этого добиться.1. Единый ListActivity используется в нескольких вкладках.2. Сохранение позиции курсора на вкладках без влияния на другие вкладки.

Приветствуем ваше решение.Заранее спасибо.

Ответы [ 4 ]

12 голосов
/ 24 августа 2011

Не вызывайте setAdapter () снова в представлении списка. Сделай что-нибудь подобное.

if(myListView.getAdapter() == null)
    myListView.setAdapter(new myAdapter(this, R.layout.row, items));

Если вам нужно обновить ListView, вызовите notifyDataSetChanged () на адаптере.

10 голосов
/ 24 августа 2011

Чтобы получить текущую позицию вашего ListView, вы можете позвонить

int position = mCatchList.getFirstVisiblePosition();

Затем, как только вы вернетесь на вкладку с этим ListView, вы можете вызвать

mCatchList.setSelection(position);

зависит от того, как написан ваш код, чтобы указать, нужно ли добавлять позицию в saveInstanceState или, тем не менее.

1 голос
/ 24 августа 2011

Переопределите onSaveInstanceState, чтобы сохранить позицию, и установите позицию обратно в onRestoreInstanceState.Пакет подобен HashMap (псевдокод):

В onSaveInstanceState:

bundle.putInt("MyTabsPosition", getPosition());

Затем в onRestoreInstanceState:

pseudo.setPosition(bundle.getInt("MyTabsPosition"));
0 голосов
/ 16 марта 2019

В listView.setOnItemClickListener используйте метод saveLastPosition.А после listview.setAdapter(adapter); вызовите метод getLastPosition

public void saveLastPosition(){
    int position=listView.getLastVisiblePosition();

    SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);    
    SharedPreferences.Editor editor=pref.edit();
    editor.putInt("lastPosition",position);   
    editor.apply();
}

public void getLastPosition(){
    int position=listView.getLastVisiblePosition();

    SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);      
    int lastPosition=pref.getInt("lastPosition",position);
    listView.setSelection(lastPosition);
}
...