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<>();
Voulez-vous dire que les cas sont null et votre adaptateur ne montre rien? – santalu
Pourquoi essayez-vous de mettre une volée dans un Asynctask? –
@ 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 –