#android #listview #android-fragments
#Android #listview #android-фрагменты
Вопрос:
итак, у меня есть проект, состоящий из действий с вкладками, который содержит просмотр списка на каждой вкладке
вкладка 1 — для просмотра заголовка вкладка 2 — для просмотра того заголовка, на который нажали пользователи
и я помещаю метод onCreateView для каждого фрагмента отдельно.
public class ChatHistory extends Fragment {
private ListView mThreadList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Returning the layout file after inflating
return inflater.inflate(R.layout.fragment_chat_history, container, false);
}
}
на каждой вкладке я хочу добавить метод для вызова данных из firebase в представление списка в каждом фрагменте.
что я хочу знать, так это то, куда я должен поместить свою логику каждого фрагмента, чтобы он мог обрабатывать ввод данных? и как бы это сказать.
спасибо за помощь.
Комментарии:
1. пожалуйста, разместите логику здесь, чтобы люди имели представление о том, что вы хотите вызывать снова и снова…
2. перед возвратом view внутри onCreateView() вы можете вызвать свой WS, используя любой определяемый пользователем метод, и обработать ваши данные, задать свой список и т. Д. И все..
3. @Radhey я пытался определить метод, но он не позволит мне определить мою переменную ListView, я пытался определить mListView = (ListView) findViewById . извините, но я новичок в Android
4. следуйте ответу @Napstars, он немного сложный, но дает вам централизованный метод для всех ваших фрагментов, который расширяет класс костюма BaseFragment.или ответ follow -Handi , он простой, и вам нужно вручную поместить все вещи так, как они изображены в ответе для каждого используемого вами фрагмента.
Ответ №1:
Fragment
s имеет аналогичный поток жизненного цикла с Activity
-ies. Имея это в виду, лучшее место для размещения логики инициализации находится в этих методах:
onCreate()
onCreateView()
Теперь можно было бы утверждать onCreateView()
, что это предпочтительнее, поскольку большую часть времени логика инициализации в приложении Android вращается вокруг компонентов пользовательского интерфейса. В то время как (в отличие Activity
от -и) onCreate()
вам не гарантируется доступ к ним.
Начиная отсюда, вы можете немного изменить свой onCreateView()
a, чтобы он выглядел так:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chat_history, container, false);
// Step 1: Initialize your views (do those nasty findViewById's here).
mThreadList = (ListView) view.findViewById(R.id.your_listview_id);
// Step 2: Do your logic of loading the required data here.
// …
return view;
}
Но не забывайте чрезмерно нагружать поток пользовательского интерфейса при выполнении Step 2
. В противном случае вы рискуете вызвать диалоговые окна ANR.
ps, мой ответ может показаться слишком широким, но это потому, что ваш вопрос в настоящее время. Если бы вы могли попытаться сузить свой вопрос, я мог бы дать лучший ответ. 🙂
Комментарии:
1. прежде всего, спасибо за ответ, так что в основном у меня есть проект с активностью вкладки, и при запуске приложения активность вкладки будет обрабатывать, какой фрагмент, который отображается, зависит от того, какая вкладка активна. у меня есть каждый класс и распространяется на каждый фрагмент (Tab1 и Tab2) отдельно. мой вопрос в том, могу ли я добавить класс, который расширяет AppCompactivity внутри Tab1.class что расширяет фрагмент?
2. Какова ваша конечная цель? Вы хотите получить доступ
TabActivity
к своим фрагментам изнутри? Или вы хотите уменьшить дублирование кода? Или это что-то совершенно отличное от этих двух?3. моя цель — добавить логику к обоим фрагментам внутри их собственного класса (Tab1.class и Tab2.class ), поэтому логика не будет отделена от класса, который распространяется на Фрагмент. извините, если я плохо описал это.
Ответ №2:
Если весь ваш фрагмент извлекает данные из firebase. Лучше создать базовый фрагмент, поместить в него всю вашу логику и вызвать его из любого фрагмента, который вы хотите.
Таким образом, он использует одно и то же описание, тот же дизайн и тот же mThreadList в каждом фрагменте.
public abstract class BaseFragment extends Fragment{
public abstract List<YourModelClass> methodToFetchDataFromFireBase(Param 1,Param 2..)//whatever your params are
private ListView mThreadList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Returning the layout file after inflating
return inflater.inflate(R.layout.fragment_chat_history, container, false);
}
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
List<YourModelClass> anyList = methodToFetchDataFromFireBase();
mThreadList.setAdapter(getActivity,anyList );
}
Теперь для каждого фрагмента просто extends
их нужно BaseFragment
. Нет необходимости использовать onCreateView
метод. Просто добавьте onViewCreated
и вызовите свой метод