2017-08-12 64 views
-2

我試圖從服務器上下載的案件清單,然後填充一個ArrayList在我RecyclerView適配器但每次使用它我嘗試填充來自的AsyncTask數組列表我可以打印數據中的每一步從填充bu而不是從我使用的Arraylist(我試圖存儲在包含我創建的類型的對象的arrayList)我不能對象添加到一個ArrayList

這是有問題的代碼 這是我的AsyncTask ... `

public class downloadingNewCases extends AsyncTask<Void,Void ,Boolean>{ 
     private String userid ; 
     private String state ; 
     public downloadingNewCases(String userid ,String state){ 
      this.userid = userid ; 
      this.state = state ; 
     } 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    Log.d(AppController.DEBUG, "download New Cases Started"); 
} 
@Override 
protected Boolean doInBackground(Void... params){ 
    Log.d(AppController.DEBUG , "user id in the get cases link.." + userid); 
    String url = AppController.ApiUrl + "GetCases?UserName="+ userid +"&stat="+state; 
    Log.d(AppController.DEBUG_LINK,url); 
try { 
JsonArrayRequest request = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { 
    @Override 
    public void onResponse(JSONArray response) { 
     Log.d("TEST", String.valueOf(response.length())); 
     for (int i = 0; i < response.length(); i++) { 
      try { 
       Log.d("TEST","downloading data"); 
       JSONObject object = response.getJSONObject(i); 
       JSONArray specs = object.getJSONArray("Spe"); 
       ArrayList<Specialities> spe = new ArrayList<>(); 
       for (int j = 0; j < specs.length(); j++) { 
        Log.d("TEST",specs.getJSONObject(j).getString("SName")); 
        spe.add(new Specialities(null, specs.getJSONObject(j).getString("SName"))); 
       } 
       Case ca = new Case(object.getString("ID") 
         , object.getString("Serial") 
         , object.getString("Name") 
         , object.getString("gender") 
         , object.getString("Age") 
         , object.getString("NatioanlityID") 
         , object.getString("HealthProblem") 
         , object.getString("CityID") 
         , object.getString("Problem") 
         , object.getString("Date") 
         , object.getString("Status") 
         , spe); 

       Log.d("TEST",ca.toString()); 

       cases.add(ca); 
       spe.clear(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}, new Response.ErrorListener() { 
    @Override 
    public void onErrorResponse(VolleyError volleyError) { 
     Log.d(AppController.DEBUG , volleyError.toString()); 

    } 
}); 
request.setRetryPolicy(new DefaultRetryPolicy(
     0, 
     DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
     DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
MySingleton.getmInstance(getActivity()).addToRequestQueue(request); 

}catch (Exception e){ 
Log.d(AppController.DEBUG,"error in the asynctask in the new cases freagment... "); 
Log.d(AppController.DEBUG ,e.toString()); 
} 
    Log.d(AppController.DEBUG, "Cases size ::" + cases.size()); 
    return true; 
} 
@Override 
protected void onPostExecute(Boolean bool) { 
    super.onPostExecute(bool); 

/* if(listener != null){ 
     listener.getCases(cases); 
    }*/ 
    adapter.notifyDataSetChanged(); 
// Log.d(AppController.DEBUG, "new Cases Downloaded..."); 


} 

} ` (我確定適配器和回收站的視圖代碼是正確的,因爲我現在可以使用相同的代碼,但是當我再次測試它時,它不再工作,我不記得我是否改變了某些東西它或沒有 - 我想不會)..

這是我onViewCreate方法。

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.doctor_new_cases_fragment,container,false); 
    Log.d(AppController.DEBUG_SHARED,"userID in the new case activity ..." + userID); 
    SharedPreferences prefs = getActivity().getSharedPreferences(AppController.PREFERENCES_NAME , Context.MODE_PRIVATE); 
    userID = prefs.getString(DoctorProfileSubmitActivity.Shared_userid,null) ; 
    downloadingNewCases tast = new downloadingNewCases(userID ,""); 
    tast.execute(); 

    recyclerView = (RecyclerView)view.findViewById(R.id.recyclervew_new_cases); 
    adapter = new CasesAdapter(view.getContext(), cases); 
    recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext())); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(adapter); 

    ViewGroup parent = (ViewGroup) view.getParent(); 
    if (parent != null){ 
     parent.removeView(view); 
    } 
    return view; 
} 

最後數組列表被聲明爲類的實例變量(類擴展片段+它是我使用我認爲尋呼機作爲用於我的選項卡式活性的標籤佈局的片段。) 這裏的ArrayList的聲明

private final ArrayList<Case> cases = new ArrayList<>(); 
+0

你是說這種情況是空的,你的適配器什麼都不顯示? – santalu

+0

你爲什麼試圖在Asynctask裏面抽空? –

+0

@ cricket_007是否包含問題? 我認爲最好是在AsyncTask中實現它,所以我不必在UI線程上執行那種東西+我可以稍後添加我的進度條 如果有更好的方法請告訴我+告訴這個實現有什麼問題 –

回答

0

對不起你們這是不值得的網站上添加一個問題馬上 我解決了這一問題。 (看來我的問題是在這裏)

Case ca = new Case(object.getString("ID") 
         , object.getString("Serial") 
         , object.getString("Name") 
         , object.getString("gender") 
         , object.getString("Age") 
         , object.getString("NatioanlityID") 
         , object.getString("HealthProblem") 
         , object.getString("CityID") 
         , object.getString("Problem") 
         , object.getString("Date") 
         , object.getString("Status") 
         , spe); 

我意外更改object.getString( 「性別」),以object.getString( 「性別」) 這引起了我JSONException。

我解決了這個問題,一切都重新開始。

感謝您的幫助,我很抱歉,如果我衝到第一問的問題沒有正確的調試會話。

0

既然你說你可以打印的每一步,該問題可能是不相關的數據資料。問題可能是您的Arraylist案例和您的CaseAdapter。

讓我們嘗試一個簡單的測試,而不是用對象的情況下填寫您的適配器,創建字符串的一個新的ArrayList,並與您的object.getString(「名稱」)填補它的響應。然後改變你的oncreateview來顯示這個使用普通字符串arrayadapter的名字列表。

如果能夠成功顯示的名字時,這意味着該錯誤是在你的情況和caseadapter,你必須表現出更多的代碼爲我們提供幫助。