2016-04-21 227 views
0

我有這個android代碼,它從服務器帶來一個JSON並從該JSON填充一個ArrayList 我檢查了ArrayList「飯食」的大小,它反應了它給我1但是當我檢查它的StringRequest對象後,我得到0項。 餐在全局範圍內定義和初始化oncreateview功能 裏面的代碼:ArrayList在添加元素後爲空

   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); 
+0

你對後面的含義感到困惑。回調是異步的。 – njzk2

回答

4

的問題在這裏是爲了瞭解asynchronous任務是如何工作的。當您向隊列添加volley請求時,它將在後臺線程(關閉主線程)中運行,並且控制權將傳遞到下一行。

所以,在此之後:

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

控制傳遞到這一點:

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

現在既然meals是在後臺線程更新,你是不是能夠通過時間控制來獲取數據達到String mealsnames[]=new String[meals.size()];

所以你會得到大小(meals.size())她即

試着將這部分代碼移到onResponse

嘗試這樣的:

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

,並調用此方法從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(); 
    } 
} 
+0

它爲我工作,謝謝你的澄清。 –

2

當你寫這篇文章 -

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

這意味着你正在異步調用和mealsrequest將在另一個線程上運行。 您打印 -

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

你讓你的mealsrequest之後。當控制達到此聲明時,您的網絡請求尚未完成。顯然,你的清單中沒有任何東西。您的列表將僅在onResponse()中填充,因爲該方法在網絡請求完成後執行。