Предположим есть 2 фрагмента, один с ListView, а другой с кнопкой. Но другой не важен. Речь не о нём. Между фрагментами переключаюсь из навигационного меню (то что сбоку выезжает). При onCreate первого фрагмента он запускает задачу, которая заполняет ListView. (важно, используется кастомный адаптер наследованный от BaseAdapter). Так вот, процесс заполнения ListView весьма продолжительный, и что бы каждый раз не ждать, пока оно снова заполнит ListView при переключении между фрагментами, полагаю нужно этот ListView как-то сохранить. Пните пожалуйста в нужную сторону.
P.S. Я пробовал сделать через parcel, но что-то не особо получалось, ибо классы у меня состоят не из базовых а-ля int,string,byte, а из инстансов других классов и инстансов базовых классов вроде File или типа того. И как мне показалось, не так просто все это дело запихать в parcel, к тому же я не совсем понял методы onSaveInstanceState(Bundle outState) и onCreate(Bundle savedInstanceState). Например, что и где передается в аргумент метода onCreate? По дэфолту там всегда null, следовательно туда нужно что-то руками пихать, но где и как? Ведь нельзя напрямую вызывать этот метод, да и дублирование вызова получится. А вот метод onSaveInstanceState(Bundle outState) вообще не вызывается. Его нужно руками вызывать? И что передавать ему как аргумент? Не совсем понимаю логику взаимодействия и передачи данных. Помогите...
я бы в вашем случае хранил бы все в базовой activity и гонял бы данные с помощью eventbus
НО .... есть подозрение что вы где при проектировании серьезно что то не учли, вы уверены что все эти данные нужны для работы listview ? File и Bitmap прекрасно заменяются бюджетным стрингом, с путем и так далее ... в большинстве случаев когда в ListView суют тяжелые данные то делают это зря
Откуда заполняется ListView? долгое заполнение не есть хорошо, возможно можно это как то оптимизировать и загружать по частям ?
зы необязательно что это так для вашего приложения, но при подобной проблеме такой вопрос стоит себе задать
Олег Гамега Вероятно, вы правы. Я сильно поспешил. Сейчас буду делать полный рефактор кода и архитектуры. Уже знаю где у меня беда.
Насчет долгого заполнения. Дело в том, что я заполняю его по мере поступления данных из провайдера, который в свою очередь рекурсивным методом сканирует файловую систему в отдельном потоке. Есть событие вроде OnNewFileFound(File file), фрагмент подписан на это событие. Каждый раз когда оно возникает, я добавляю найденный файл в адаптер листа и делаю .notifyDataSetChanged();. Немного позже, я нашел проблему связанную с этим подходом. Если, предположим, на мощном телефоне рекурсивное сканирование будет проходить очень быстро, и следовательно событие OnNewFile... будет вызываться очень часто через очень короткие промежутки времени - то начинает тупить отображение, насколько я понял из-за большой нагрузки на .notifyDataSetChanged();.
Я сделал немного по другому. Создал Queue, и таймер в фрагменте. Когда возникает событие, я помещаю новый файл в очередь, тем временем таймер время от времени, с неким промежутком (200-400 мс) затягивает новые данные из очереди, добавляет их в адаптер, и после чего делает .notifyDataSetChanged();. Так работает, как мне показалось лучше и правильнее, но в сумме время работы осталось прежним. Лист как заполнялся долго, так и заполняется. Сейчас разговор идет примерно о 200-300 записях. Странно было то, что даже не используя рекурсию, а считывая построчно данные для листа из текстового файла - дело быстрее не пошло. Всё равно долго. Храню я не такие уж и тяжелые данные. Чек бокс, и пара текст боксов.
Но.. у меня уже есть несколько подозрений на этот счет. Сейчас буду исправлять.
egotyner: ваша задача хорошо ложится в RecyclerView. У него есть метод notifyItemInserted, не нужно будет дёргать весь dataSet при вставке. И пока юзер не доскроллит до новых элементов, вообще ничего происходить с ними не будет.
Денис Загаевский: посмотрю в эту сторону.. я просто с шарпа пришел, и для меня андроид сдк нечто новое. не знаю его тонкостей, как и нюансов джавы. Скажите пожалуйста, можно ваш ящик попросить, пару вопросов задать?