Получение данных из 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
тег