2016-06-06 3 views
0

Я хочу показать 3 fragments в моих данных Activity и нагрузки от json в любом fragments! Я хочу показать каждый json-данные в один фрагмент, но в моем приложении показать все данные во всех фрагментах!
Например: я хочу показать статьи данных в фрагмент статьи, музыки данных в музыкального фрагмента и многого другое .... но теперь покажу все данные (статьи, музыку, видео) во всех fragment s!
В моем приложении я использую EventBus для отправки данных и использовать одну DataModel для сохранения данных в формате JSON в этом.
Как загружать данные в одном фрагменте в Android

Фрагмент 1:

public class free_fragment extends Fragment { 

    private RecyclerView mRecyclerView; 
    private free_recycler_adapter mAdapter; 
    private RecyclerView.LayoutManager mLayoutManager; 
    private List<DataModel> dataModels = new ArrayList<DataModel>(); 

    private Context context; 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
          ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_free_layout, container, false); 

     context = getContext(); 

     if (!EventBus.getDefault().isRegistered(this)) { 
      EventBus.getDefault().register(this); 
     } 

     LoadData(); 

     ///----- RecyclerView ----- 
     mRecyclerView = (RecyclerView) view.findViewById(R.id.pdf_RecyclerView); 
     mRecyclerView.setHasFixedSize(true); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
     mAdapter = new free_recycler_adapter(context, dataModels); 
     mRecyclerView.setAdapter(mAdapter); 

     return view; 
    } 

    @Subscribe 
    public void onEvent(List<DataModel> mainInfoModels) { 
/*  if (dataModels.size() > 0) { 
      dataModels.remove(dataModels.size() - 1); 
      mAdapter.notifyItemRemoved(dataModels.size()); 
      //mAdapter.setLoaded(); 
     }*/ 

     mAdapter.add(mainInfoModels); 
     mAdapter.notifyDataSetChanged(); 
    } 

    private void LoadData() { 
     freeDataInfo dataInfo = new freeDataInfo(); 
     // here getMainDataInfo() should return the server response 
     dataInfo.getFreeDataInfo(context); 
    } 

Фрагмент 2:

public class paid_fragment extends Fragment { 

    private RecyclerView mRecyclerView; 
    private paid_recycler_adapter mAdapter; 
    private RecyclerView.LayoutManager mLayoutManager; 
    private List<DataModel> dataModels = new ArrayList<DataModel>(); 

    private Context context; 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
          ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_paid_layout, container, false); 

     context = getContext(); 

     if (!EventBus.getDefault().isRegistered(this)) { 
      EventBus.getDefault().register(this); 
     } 

     LoadData(); 

     ///----- RecyclerView ----- 
     mRecyclerView = (RecyclerView) view.findViewById(R.id.voice_RecyclerView); 
     mRecyclerView.setHasFixedSize(true); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
     mAdapter = new paid_recycler_adapter(context, dataModels); 
     mRecyclerView.setAdapter(mAdapter); 

     return view; 
    } 

    @Subscribe 
    public void onEvent(List<DataModel> mainInfoModels) { 
/*  if (dataModels.size() > 0) { 
      dataModels.remove(dataModels.size() - 1); 
      mAdapter.notifyItemRemoved(dataModels.size()); 
      //mAdapter.setLoaded(); 
     }*/ 

     mAdapter.add(mainInfoModels); 
     mAdapter.notifyDataSetChanged(); 
    } 

    private void LoadData() { 
     paidDataInfo dataInfo = new paidDataInfo(); 
     // here getMainDataInfo() should return the server response 
     dataInfo.getPaidDataInfo(context); 
    } 

AsyncTask кодирует фрагмент 1:

public class freeDataInfo { 
    private Context mContext ; 
    private String ServerAddress = freeServer_IP.getFreeIP(); 

    public void getFreeDataInfo(Context context) { 
     mContext = context; 
     new getInfo().execute(ServerAddress + "limit=10"); 
    } 

    private class getInfo extends AsyncTask<String, Void, String> { 
     EventBus bus = EventBus.getDefault(); 
     private String ou_response; 
     private List<DataModel> infoModels; 

     @Override 
     protected void onPreExecute() { 
      CustomProcessDialog.createAndShow(mContext); 
      infoModels = new ArrayList<>(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      OkHttpClient client = new OkHttpClient(); 

      //String url = (String) params[0]; 
      Request request = new Request.Builder() 
        .url(ServerAddress + "limit=10") 
        .cacheControl(CacheControl.FORCE_NETWORK) 
        .build(); 

      Response response; 
      try { 
       response = client.newCall(request).execute(); 
       ou_response = response.body().string(); 
       response.body().close(); 
       if (ou_response != null) { 
        try { 
         JSONObject postObj = new JSONObject(ou_response); 
         JSONArray postsArray = postObj.optJSONArray("result"); 
         infoModels = new ArrayList<>(); 

         for (int i = 0; i <= infoModels.size(); i++) { 
          JSONObject postObject = (JSONObject) postsArray.get(i); 

          int id = postObject.getInt("id"); 
          Log.d("id", String.valueOf(id)); 
          String title = postObject.getString("title"); 
          String description = postObject.getString("description"); 
          String image = postObject.getString("image"); 
          String category = postObject.getString("categoryName"); 
          String date = postObject.getString("publishDate"); 

          Log.d("Data", "Post ID: " + id); 
          Log.d("Data", "Post title: " + title); 
          Log.d("Data", "Post image: " + image); 
          Log.d("Data", "---------------------------------"); 

          //Use the title and id as per your requirement 
          infoModels.add(new DataModel(id, title, description, category, date, image)); 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
         Log.e("error", String.valueOf(e)); 
        } 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
       Log.e("error2", String.valueOf(e)); 
      } 
      return ou_response; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      CustomProcessDialog.dissmis(); 
      if (result != null) { 
       bus.post(infoModels); 
      } else { 
       Toast.makeText(mContext, "Empty", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
} 

AsyncTask коды Фрагмент 2:

public class paidDataInfo { 
    private Context mContext; 
    private String ServerAddress = paidServer_IP.getPaidIP(); 

    public void getPaidDataInfo(Context context) { 
     mContext = context; 
     new getInfo().execute(ServerAddress + "limit=10"); 
    } 

    private class getInfo extends AsyncTask<String, Void, String> { 
     EventBus bus = EventBus.getDefault(); 
     private String ou_response; 
     private List<DataModel> infoModels; 

     @Override 
     protected void onPreExecute() { 
      CustomProcessDialog.createAndShow(mContext); 
      infoModels = new ArrayList<>(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      OkHttpClient client = new OkHttpClient(); 

      //String url = (String) params[0]; 
      Request request = new Request.Builder() 
        .url(ServerAddress + "limit=10") 
        .cacheControl(CacheControl.FORCE_NETWORK) 
        .build(); 

      Response response; 
      try { 
       response = client.newCall(request).execute(); 
       ou_response = response.body().string(); 
       response.body().close(); 
       if (ou_response != null) { 
        try { 
         JSONObject postObj = new JSONObject(ou_response); 
         JSONArray postsArray = postObj.optJSONArray("result"); 
         infoModels = new ArrayList<>(); 

         for (int i = 0; i <= infoModels.size(); i++) { 
          JSONObject postObject = (JSONObject) postsArray.get(i); 

          int id = postObject.getInt("id"); 
          Log.d("id", String.valueOf(id)); 
          String title = postObject.getString("title"); 
          String description = postObject.getString("description"); 
          String image = postObject.getString("image"); 
          String category = postObject.getString("categoryName"); 
          String date = postObject.getString("publishDate"); 

          Log.d("Data", "Post ID: " + id); 
          Log.d("Data", "Post title: " + title); 
          Log.d("Data", "Post image: " + image); 
          Log.d("Data", "---------------------------------"); 

          //Use the title and id as per your requirement 
          infoModels.add(new DataModel(id, title, description, category, date, image)); 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
         Log.e("error", String.valueOf(e)); 
        } 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
       Log.e("error2", String.valueOf(e)); 
      } 
      return ou_response; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      CustomProcessDialog.dissmis(); 
      if (result != null) { 
       bus.post(infoModels); 
      } else { 
       Toast.makeText(mContext, "Empty", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
} 

Как я могу исправить эту проблему?

+0

@mehrdad khosravi, mitoonid komak konid shoma? –

ответ

0

Это связано с тем, что вы неправильно используете автобус событий. все ваши функции обратного вызова для извлечения json-данных имеют одинаковую подпись, поэтому event-шина будет передавать данные всем пользователям каждый раз, когда вы получаете данные с сервера.

один способ исправить это, чтобы создать отдельные модели для Fragment с так:

class FreeDataModel extends DataModel {} 

и

class PaidDataModel extends DataModel {} 

и в ваших AsyncTask с вместо того, чтобы иметь List<DataModel> вы должны использовать List<FreeDataModel> и List<PaidDataModel>, а также изменить свою функцию функций обратного вызова в вашей Fragment s (onEvent функция каждого Fragment), а затем ваш запрос em будет решена.

Смежные вопросы