2017-08-12 3 views
-2

J'essaie de télécharger une liste de cas d'un serveur, puis de remplir un arraylist pour l'utiliser dans mon adaptateur RecyclerView mais chaque fois que j'essaie de remplir la liste de tableau depuis asynctask i peut imprimer les données dans chaque étape de la population non de l'Arraylist que j'utilise (j'essaye de stocker dans un arrayList qui contient des objets du type Cas que j'ai créé)Je ne peux pas ajouter d'objets à un arrayList

ceci est la partie de le code avec le problème c'est mon 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..."); 


} 

} ` (Je suis sûr que le code d'affichage de l'adaptateur et du recycleur est correct car je pourrais utiliser le même code maintenant mais quand je suis venu le tester, ça ne fonctionnait plus et je ne me rappelle pas si j'ai changé quelque chose ou pas - je ne pense pas)

c'est ma méthode 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; 
} 

et enfin la liste Array est déclarée comme une variable d'instance de la classe (la classe étend Fragment + est un fragment que j'utilise dans mon téléavertisseur vue comme une mise en page d'onglet pour mon activité onglets.) est ici la déclaration ArrayList

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

Voulez-vous dire que les cas sont null et votre adaptateur ne montre rien? – santalu

+0

Pourquoi essayez-vous de mettre une volée dans un Asynctask? –

+0

@ cricket_007 est-ce qui contient un problème? Je pensais qu'il est préférable de l'implémenter dans AsyncTask donc je n'ai pas à exécuter ce genre de choses sur le thread UI + je peux ajouter ma barre de progression plus tard aussi s'il y a une meilleure façon de dire tell + tell quel est le problème avec cette implémentation –

Répondre

0

désolé les gars, il ne valait pas la peine d'ajouter une question sur le site tout de suite J'ai résolu le problème. (Il semble que mon problème était ici)

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

i accidentellement changé object.getString ("genre") à object.getString ("genre") qui m'a causé un JSONException. J'ai corrigé cela et tout fonctionne de nouveau.

merci pour votre aide et je suis désolé si je me suis précipité pour poser la question sans une bonne session de débogage d'abord.

0

Puisque vous dites que vous pouvez imprimer les données à chaque étape du chemin, le problème est probablement pas lié à vos données. Le problème pourrait être votre Arraylist d'affaire et votre CaseAdapter.

Essayons un simple test, au lieu de remplir votre adaptateur avec des objets case, créez une nouvelle ArrayList de chaîne et remplissez-la avec object.getString ("name") dans votre réponse on. Changez ensuite votre oncreateview pour afficher cette liste de noms en utilisant un arrayadapter de chaîne normal.

Si vous pouvez afficher les noms avec succès, cela signifie que le bug est dans votre cas et caseadapter, vous devrez montrer plus de code pour nous aider.