usa tutorial que para elastic consultas comandos android android-fragments android-asynctask android-json

tutorial - Cómo cargar datos json en fragmento en Android



elasticsearch tutorial (2)

Siempre publica el mismo evento para cada fragmento, luego obtiene todos los elementos en todos los fragmentos. Necesitas una clase al publicar EventBus :

public class MyEvent { private String fragmentTag ; private ArrayList<DataModel> infoModels ; public MyEvent (String tag,ArrayList<DataModel> models){ this.fragmentTag = tag; this.infoModels = models; } }

Luego publicando como:

bus.post(new MyEvent ("forfragment1",infoModels) );

Luego en tu Fragmento1:

@Subscribe public void onEvent(MyEvent event) { if(event.fragmentTag.equals("forfragment1")) { //populate your view , do something } } private void LoadData() { freeDataInfo dataInfo = new freeDataInfo(); // here getMainDataInfo() should return the server response dataInfo.getFreeDataInfo(context); }

¡Quiero mostrar 3 fragments en mi Activity y cargar datos de json en cualquier fragments ! Quiero mostrar todos los datos json en un fragmento, pero en mi aplicación mostrar todos los datos en todos los fragmentos!
Por ejemplo: quiero mostrar datos de artículos en fragmentos de artículos , datos de música en fragmentos de música y más ... ¡pero ahora muestre todos los datos (artículo, música, video) en todos los fragment !
En mi aplicación, uso EventBus para enviar datos y uso un DataModel para guardar datos DataModel en esto.

Fragmento 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); }

Fragmento 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); }

Códigos AsyncTask para el Fragmento 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(); } } } }

Códigos AsyncTask para el Fragmento 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(); } } } }

Como puedo solucionar este problema ?


for (int i = 0; i <= infoModels.size(); i++)

Reemplazar con

for (int i = 0; i <= postsArray.length(); i++)

También infoModels ArrayList infoModels One Time

private List<DataModel> infoModels = new ArrayList<>();

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 = new ArrayList<>(); @Override protected void onPreExecute() { CustomProcessDialog.createAndShow(mContext); } @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"); for (int i = 0; i <= postsArray.length(); 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(); } } } }