Как сохранить и восстановить позицию ListView в Android

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

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


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

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

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

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


person Avinash    schedule 23.08.2011    source источник
comment
Похоже, вы создаете новый ListView или каким-то образом обновляете содержимое каждый раз, когда переключаетесь на вкладку. Не могли бы вы опубликовать свой код?   -  person Michell Bak    schedule 24.08.2011
comment
См. следующий пост, который может вам помочь: stackoverflow.com/questions/3014089/   -  person Xebozone    schedule 01.11.2014


Ответы (4)


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

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

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

person b_yng    schedule 23.08.2011

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

int position = mCatchList.getFirstVisiblePosition();

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

mCatchList.setSelection(position);

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

person hooked82    schedule 23.08.2011
comment
Можно ли получить плавающую позицию? когда я это делаю, он прыгает в верхнюю часть позиции просмотра - person Kirill Kulakov; 22.08.2012
comment
Я считаю, что это возможно, если получить максимальное представление и узнать, сколько отображается на экране. У меня нет примера для этого, но я уверен, что быстрый поиск что-то выдаст - person hooked82; 29.08.2012
comment
Я обнаружил, что можно сохранить предварительный объект и восстановить его. - person Kirill Kulakov; 29.08.2012
comment
@KirillKulakov, что вы подразумеваете под «предварительным» объектом? Объясните пожалуйста, у меня похожая проблема. - person Sufian; 23.05.2013

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

In onSaveInstanceState:

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

Затем в onRestoreInstanceState:

pseudo.setPosition(bundle.getInt("MyTabsPosition"));
person CrackerJack9    schedule 24.08.2011

В 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);
}
person AnAIDE    schedule 16.03.2019
comment
Добавление описания и объяснения к ответу помогает автору и другим пользователям понять, что вы сделали или почему ваш ответ полезен... - person Vipin Kumar Soni; 16.03.2019