2014-08-27 1 views
3

У меня есть MainActivity с SearchFragment и SearchResultFragment.Перечислить список сложных объектов из активности в фрагмент

Когда пользователь нажимает кнопку поиска, я выполняю обратный вызов из SearchFragment в MainActivity с параметрами SearchParameters в качестве параметров.

На MainActivity I, чем показать LoadFragment и загрузить результаты.
Когда я получаю результаты, я хочу передать список объектов результатов в SearchResultFragment.

Каков наилучший способ для этого?

Я знаю, что вы обычно делаете это так, если это был только один результат:

public static SearchResultFragment newInstance(SearchResult result) { 
    SearchResultFragment f = new SearchResultFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("result", result); // Make result parceable 
    f.setArguments(args); 
    return f; 
} 

Но как я это делаю со списком объектов?

Другое решение, о котором я могу думать, это получить ссылку на MainActivity в методе onAttach фрагмента, а затем вызвать метод getResults() в MainActivity.

Что было бы лучшим способом?

+0

Используйте тот же подход обратного вызова, который отправляет список из активности в фрагмент. – Luksprog

+0

Решена ли ваша проблема или вам нужна дополнительная помощь? Пожалуйста, не забудьте поднять полезные ответы и принять тот, который вам больше всего помог. –

ответ

6

В большинстве случаев вы можете избежать необходимости передавать сложные объекты, но если вы не можете, просто используйте геттеры и сеттеры. Попробуйте что-то вроде этого:

public static SearchResultFragment newInstance(SearchResult result) { 
    SearchResultFragment f = new SearchResultFragment(); 
    f.setResult(result);   
    return f; 
} 

НО пытаются избежать этого, передавая данные с Bundle это гораздо лучшее решение. Используйте Parcelable везде, где сможете.

4

Примечание: в моем ответе предполагается, что вы пытаетесь передать агрегирование данных фрагменту один раз. Если вы пытаетесь регулярно обновлять существующий фрагмент с новой информацией (новые результаты), то, возможно, лучше иметь выделенный метод в Fragment для сохранения результатов в качестве аргументов и обновления пользовательского интерфейса.

Оба подхода могут быть приемлемыми, особенно в зависимости от области действия, которую вы хотите предоставить своим результатам поиска, но я бы предпочел передать результаты в качестве «статического» параметра (что не вызвано динамическим из-за Activity) в основном для по следующим причинам:

  • Fragment s предназначены в качестве многоразовых частей пользовательского интерфейса, то есть Android базы позволяет интегрировать же Fragment в другом Activity; в этом случае легче интегрировать (более гибко), чем если бы подключенный Activity должен реализовать данный геттер, а Fragment мог бы фактически быть сконструирован другим объектом (например, «приемником результата») и прикреплен к Activity, не зная о нем результаты (облегчают возможность рефакторинга)
  • Fragment аргументы сохраняются, что означает, что тот же код инициализации Fragment (который извлекает результаты из аргументов) также будет обрабатывать автоматическую переустановку Fragment после перезапуска активности (например,вращение экрана), например; в противном случае вы дополнительно должны обрабатывать сохранение и восстановление результатов лиц сами

С другой стороны, положив результаты в Bundle в качестве Fragment параметра будет немного медленнее, так как после получения новых результатов вы создаете дополнительную структуру (Bundle), который вы затем посылку (сериализуете) и unparcel (deserialize). Это будет быстрее при перезагрузке Activity, так как вам не нужно его посылку в этом случае (это уже сделано). Я просто упомянул об этом ради полноты, но с тех пор, если ваши результаты не очень большие (что является допустимым вариантом использования, но, возможно, больше подходит для постраничной загрузки?), Вы не заметите и в любом случае не должны волновать.

Чтобы передать несколько результатов к Fragment (предполагая, что единственный результат является int):

final Bundle args = new Bundle(); 
args.putIntArray(SearchResultFragment.ARG_NAME_RESULTS, results); // results being an int[] 
fragment.setArguments(args); 

Просто используйте Bundle#putIntegerArrayList(String, ArrayList<Integer>) вместо этого, если results имеет тип ArrayList<Integer>.