2

У меня есть ViewPager, который по существу отображает пользовательский вид ListFragment, за исключением разных данных. Поэтому я думаю, что должен быть способ, которым я могу использовать этот самый ListFragment, но заполнять его различными данными, основываясь на том, какую страницу он показывает.Android: повторное использование listfragment в viewpager

Использование Google Play Data Store в качестве примера, я хотел бы иметь

  1. страница 1 - сортировать Paid Apps по цене по возрастанию
  2. страница 2 - сортировать Paid Apps по цене по убыванию
  3. страницу 3 - сортировать бесплатные приложения по рейтингу по убыванию

Как я могу достичь вышеуказанного? Страница 1 и страница 2 имеют одинаковые данные, поэтому их нужно сортировать (я сделал это с Collections.sort), но на странице 3 показан ListFragment с таким же пользовательским представлением, за исключением того, что ему необходимо отправить запрос на сервер для загрузки бесплатных приложений вместо.

спасибо! :)

+0

Передайте аргументы в 'ListFragment' с помощью метода setArguments()' и используйте эту информацию на своих страницах, чтобы различать и применять разные действия. –

+0

hmmm это сделано в методе 'getItem' моего' FragmentPagerAdapter'? – chongzixin

+0

проверьте [this] (https://github.com/lalit3686/ViewPagerDemo) пример, чтобы узнать, как передать аргументы фрагменту. –

ответ

0

Хорошо, хорошо, вот настройка, которую я предполагаю, что у вас есть.

Каждый ListView поставляется с данными через ListAdapter.

A ViewPager предоставлен PagerAdapter.

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

Ваш FragmentPagerAdapter может поставлять один и тот же адаптер для каждого фрагмента, который разделяет данные. Каждый фрагмент может запрашивать данные в том порядке, в котором он хочет, и адаптер будет сортировать его и отправлять значения с помощью метода getView(), когда фрагмент строит свое представление.

В случае FragmentPagerAdapter он будет заменять фрагменты и хранить их в памяти, чтобы они уже использовались для вас. Однако их взгляды могут быть уничтожены и перестроены. Каждый раз, когда ListFragment перестраивает свое представление, он будет вызывать метод getView() поставляемого адаптера. Метод getView() возвращает каждую строку списка в зависимости от запрошенной позиции.

Потому что это все те же данные, вам нужен только один адаптер, содержащий данные. Тем не менее, он нуждается в возможности получить информацию в том порядке, в котором вы запрашиваете. Это можно сделать по-разному, но на самом деле все заботы о том, что он получает от getView(). Таким образом, ваш ListFragment может сообщить вашему адаптеру, что он хочет получить данные. Затем ваш адаптер может предоставить данные в указанном порядке, исходя из значения позиции getView().

+0

Могу ли я сказать, что приведенное выше решение предназначено только для сортировки данных (в моем примере в Google Play Store сортировка Top Paid Apps в порядке возрастания и убывания)?также, чтобы уточнить мою настройку (потому что я не уверен, соответствует ли она точно тому, что вы сказали), каждый «ListFragment» поставляется с данными через «ArrayAdapter», а мой «ViewPager» предоставляется «FragmentPagerAdapter». Мой «ArrayAdapter» создан, и «ListAdapter» устанавливается в 'asyncTaskCompleted', когда возвращается мой служебный вызов. Как в этом случае «ViewPagerAdapter» связывается с моим «ListAdapter»? – chongzixin

+0

Ваш «FragmentPagerAdapter» создает фрагменты, правильно? Если это так, то это также будет тот, который поставляет «ArrayAdapter» в ваш «ListFragment» при создании. «FragmentPagerAdapter» может уничтожить представление фрагмента в любое время, поэтому, когда ему нужно его перестроить, он сделает это через любой «адаптер», который вы его поставляете. В этом случае, поскольку это все те же данные, но отсортированы по-разному, у вас может быть один «ArrayAdapter», который используется каждым списком. Каждый список будет запрашивать заказ, который он хочет, и адаптер может предоставить представления в этом порядке. – DeeV

+0

Я думаю, что сначала объяснил это неправильно. Я обновил свой ответ. Надеюсь, это менее запутанно. – DeeV

Смежные вопросы