Получение данных из json один раз и использование их в 3 фрагментах

Я получаю данные от JSON используя залп, есть 3 Fragment в Activity который я должен заполнить эти фрагменты с данными, которые я получил от JSON в MainActivity, Я хотел бы получить данные от JSON один раз и использовать его в Activity и во всех этих 3 Fragment, Я положил полученные данные в List как это:

List<Display_Activity_Model> videoDetailList;

и я отправляю этот список из деятельности в другие фрагменты, используя интерфейс как:

В деятельности у меня есть этот метод:

@Override
public List<Display_Activity_Model> getDataList() {
    return videoDetailList;
}

В одном из фрагментов у меня есть:

public interface GetDataInterface {
    List<Display_Activity_Model> getDataList();
}
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    try {
        sGetDataInterface= (GetDataInterface) context;
    } catch (ClassCastException e) {
        throw new ClassCastException(context.toString() + "must implement GetDataInterface Interface");
    }
}

@Override
public void onResume() {
    super.onResume();
    if(sGetDataInterface != null){
        dataListFromDispAct = sGetDataInterface.getDataList();
    }
}

Когда я отлаживаю код, я вижу, что метод getDataList в MainActivity перед вызовом метода вызывается json с залпом. Поэтому все время получаю пустой список.

У меня такой вопрос: каков наилучший способ получить данные залпом один раз и использовать их в других фрагментах?

Update1:

@Keita Junichiro:

Я определил метод "обновления" во фрагменте, например:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.video_info,container,false);

    initComponents(view);

   if (dataListFromDispAct != null) {
        txt_view_count.setText(dataListFromDispAct.get(0).getView_count());
    }

    return view;
}

public void update(List<Display_Activity_Model> videoDetailList){

    dataListFromDispAct=videoDetailList;

}

и я вызываю метод "update" в действии после того, как json загружен в метод "getItemMenuGson":

getItemMenuGson(new CallBack() {
        @Override
        public void onSuccess(List<Display_Activity_Model> itemMenuGsonList) {
            videoDetailList=itemMenuGsonList;
            new Video_Info().update(videoDetailList);

        }

        @Override
        public void onFail(String msg) {

        }
    });

Проблема в том, что метод "onCreateView" во фрагменте вызывается перед методом обновления. Когда я объявляю метод обновления статическим, он также остается неизменным, а переменная dataListFromDispAct всегда имеет значение null.

Update2:

Результат отладки

Обновление 3: @Piyush

Я реализовал ваш ответ, но он не работает в этой проблеме. Я получаю пустой список, потому что метод onCreateView выполняется раньше, чем метод getItemMenuGson в Activity. Я объявил:

SharedApplication mapp = SharedApplication.getInstance();
ArrayList<String> myList = mapp.getArrayListData();

в onActivity Создано во фрагменте, но также выполняется перед методом getItemMenuGson в Activity. Порядок вызова методов:

порядок выполнения метода

что я должен делать? Как я могу вызвать метод getItemMenuGson в Activity, чтобы получить JSON, а затем загрузить макет фрагмента, чтобы заполнить эти загруженные данные фрагментом?

Решение: ключом к проблеме был статический метод, который запускается первым:

Определите следующие коды во фрагменте:

public class Video_Info extends Fragment {

static TextView txt_view_count;
List<Display_Activity_Model> dataListFromDispAct;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
  {
    View view=inflater.inflate(R.layout.video_info,container,false);
    txt_view_count= (TextView) view.findViewById(R.id.txt_view_count);
    return view;
  }
public static void update(List<Display_Activity_Model> videoDetailList)
  {
    txt_view_count.setText(videoDetailList.get(0).getView_count());
  }
 }

В разделе " Активность" после извлечения данных из JSON в список методов обновления вызовов:

 getItemMenuGson(new CallBack() {
    @Override
    public void onSuccess(List<Display_Activity_Model> itemMenuGsonList) {
        videoDetailList = itemMenuGsonList;

         //////////////////
        Video_Info.update(videoDetailList);
        ///////////////////

        Uri vidUri = Uri.parse(itemMenuGsonList.get(0).getMedia().getURL());
        vidView.setVideoURI(vidUri);

    }

3 ответа

Решение

Чтобы отправить данные из действия во фрагмент после вызова API, вы можете создать метод update() во фрагменте для получения данных и вызвать фрагмента.update() в действии, когда loadData finish().

new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        //Parse resonse to *videoDetailList*
        fragment.update(videoDetailList);
    }
}

Сделать интерфейс с методом onDownloadComplete,

public interface DelegateClass {
    public static onDownloadComplete(String jsonData);
}

Теперь получить данные с Волей в Activity и вызвать этот метод. Реализуйте этот интерфейс во всех ваших фрагментах и ​​переопределите onDownloadComplete, Этот метод будет вызван, когда ваш Activity заканчивает выборку данных подобно

public class YourFragment implements DelegateClass {
    ...
    ...
    @Override
    public static onDownloadComplete(String jsonData){
        //do what you want with data
    }
    ...
    ...
}

Надеюсь, поможет

Сначала создайте один класс приложения

public class SharedApplication extends Application{

ArrayList<String> arraylist;

public static SharedApplication instance=null;

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
}

public static SharedApplication getInstance()
{
    if(instance==null)
    {
        instance=new SharedApplication();
    }
    return instance;
}

public void setArrayListData(ArrayList<String> setData)
{
    arraylist=setData;
}

public ArrayList<String> getArrayListData()
{
    return arraylist;

}

}

Теперь в вашей деятельности инициализируйте класс приложения, используя

SharedApplication mApp; // declare global

инициализировать в методе onCreate()

mApp = SharedApplication.getInstance();

Теперь после разбора ваших данных с сервера установите данные в массиве

mApp.setArrayListData(yourArrayList);

Теперь, когда вы хотите получить данные любого фрагмента, вы должны инициализировать класс приложения в каждом фрагменте, в котором вы хотите получить массив.

Подобно,

SharedApplication mapp = SharedApplication.getInstance();
ArrayList<String> myList = mapp.getArrayListData();

Примечание: вы должны добавить SharedApplication класс в вашем манифесте application тег

Другие вопросы по тегам