java android arraylist

java - ArrayList está vacío después de agregar elementos



android (2)

Tengo este código de Android que trae un JSON de un servidor y llena una ArrayList de ese JSON. Verifiqué el tamaño de las "comidas" de ArrayList dentro del vacío de respuesta que me da 1, pero cuando lo verifico después del objeto StringRequest obtengo 0 elementos. . Las comidas se definen en el ámbito global y se inicializan dentro de la función oncreateview El Código:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment Log.i("debug","on create view"); View view =inflater.inflate(R.layout.fragment_meal_list,container,false); ListView List ; meals=new ArrayList<meal>(); String url="http://syriankitchen.tk/get_recent.php"; StringRequest mealsrequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { try{ JSONObject object= new JSONObject(response); JSONArray mealsArray = object.getJSONArray("result"); for(int i=0;i<mealsArray.length();i++){ JSONObject cur = mealsArray.getJSONObject(i); int id= cur.getInt("id"); String name= cur.getString("name"); String description = cur.getString("description"); int price = cur.getInt("price"); meals.add(new meal(id,name,price,description)); } Log.i("debug","meals size = "+meals.size()); } catch(JSONException e){ e.printStackTrace(); } } },new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError error) { Toast.makeText(getActivity(),error.getMessage(),Toast.LENGTH_SHORT).show(); } }); Volley.newRequestQueue(getActivity()).add(mealsrequest); ArrayList<String> strs=new ArrayList<String>(); String mealsnames[]=new String[meals.size()]; for(int i=0;i<meals.size();i++)strs.add(meals.get(i).getName()); strs.toArray(mealsnames); Log.i("debug","meals ou size "+meals.size()); CustomList adapter = new CustomList(getActivity(),mealsnames,meals); List = (ListView)view.findViewById(R.id.list); List.setAdapter(adapter);


Cuando escribes esto ...

Volley.newRequestQueue(getActivity()).add(mealsrequest);

Eso significa que está haciendo una llamada asincrónica y que la mealsrequest se ejecutará en otro hilo. Estás imprimiendo

Log.i("debug","meals ou size "+meals.size());

justo después de hacer su mealsrequest . Cuando el control llega a esta declaración, su solicitud de red aún no se ha completado. Aparentemente, no tienes nada en tu lista. Su lista se completará solo en onResponse() , ya que ese método se ejecuta después de que se completa la solicitud de red.


El problema aquí es entender cómo funcionan asynchronous tareas asynchronous . Cuando agrega una solicitud de volley a la queque, se ejecutará en el subproceso de fondo (fuera del subproceso principal) y el control pasará a la siguiente línea.

Entonces, después de esto:

Volley.newRequestQueue(getActivity()).add(mealsrequest);

el control pasa a esto:

ArrayList<String> strs=new ArrayList<String>(); String mealsnames[]=new String[meals.size()];

Ahora, dado que las meals se actualizan en el subproceso de fondo, no puede obtener los datos cuando el control llega a String mealsnames[]=new String[meals.size()];

Por lo tanto, obtendrá un tamaño cero ( meals.size() ) aquí.

Intente mover esta parte del código a onResponse .

Intenta así:

public void updateData(){ ArrayList<String> strs=new ArrayList<String>(); String mealsnames[]=new String[meals.size()]; for(int i=0;i<meals.size();i++)strs.add(meals.get(i).getName()); strs.toArray(mealsnames); Log.i("debug","meals ou size "+meals.size()); CustomList adapter = new CustomList(getActivity(),mealsnames,meals); List = (ListView)view.findViewById(R.id.list); List.setAdapter(adapter); }

y llame a este método desde onResponse :

@Override public void onResponse(String response) { try{ JSONObject object= new JSONObject(response); JSONArray mealsArray = object.getJSONArray("result"); for(int i=0;i<mealsArray.length();i++){ JSONObject cur = mealsArray.getJSONObject(i); int id= cur.getInt("id"); String name= cur.getString("name"); String description = cur.getString("description"); int price = cur.getInt("price"); meals.add(new meal(id,name,price,description)); } Log.i("debug","meals size = "+meals.size()); updateData(); } catch(JSONException e){ e.printStackTrace(); } }