Могу ли я поместить логику в другой файл для обработки файла фрагмента? Android Studio

#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 и вызовите свой метод