2017-07-14 1 views
0

J'ai été bloqué sur celui-ci pendant un moment, alors je cherche enfin quelques indices. L'activité principale de mon application effectue une requête Volley GET sur Create et mes éléments ListView s'affichent correctement. En cliquant sur un élément de la liste, je passe des données à une autre activité où j'effectue ensuite une requête POST Volley qui met à jour ma base de données. Je suis alors ramené à mon activité principale où l'élément ListView précédemment sélectionné devrait immédiatement se mettre à jour (disparaître de la liste ou changer TextViews, etc.), mais il semble être un cycle en arrière si je sélectionne un autre élément et répète le processus.Volley Demande non mise à jour de données revenant d'une autre activité

J'ai testé plusieurs choses avec onResume mais je n'arrive pas à le faire fonctionner. J'ai même mis toute la requête de volée dans une méthode et j'ai essayé de l'appeler onResume mais cela a fait que ma boîte de dialogue de progression s'est bloquée et a dupliqué tout dans la liste. Toutefois, une actualisation manuelle de la liste appelée par une méthode à partir d'une barre d'outils fonctionne correctement, ainsi qu'une requête à partir d'une exécution exécutable temporisée.

UserListActivity

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_user_list); 

//Setting adapter to the listView 
listView =(ListView) findViewById(R.id.list); 

adapter =new CustomListAdapter(this,userList); 
listView.setAdapter(adapter); 

// Showing progress dialog before making http request 
pDialog =new ProgressDialog(this); 
pDialog.setMessage("Loading..."); 
pDialog.show(); 

if(userList!=null) { 
    userList.clear(); 
} 

// Creating volley request obj 
JsonArrayRequest userReq = new JsonArrayRequest(url, 
    new Response.Listener<JSONArray>() { 
     @Override 
     public void onResponse(JSONArray response) { 
      Log.d(TAG, response.toString()); 
      hidePDialog(); 

      // Parsing json 
      for (int i = 0; i < response.length(); i++) { 
       try { 

        JSONObject obj = response.getJSONObject(i); 
        User user = new User(); 
        user.setUserId(obj.getString("user_id")); 
        user.setFirstName(obj.getString("firstname")); 
        user.setLastName(obj.getString("lastname")); 

        // adding user to users array 
        userList.add(user); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } 

      adapter.notifyDataSetChanged(); 
     } 
    }, new Response.ErrorListener() { 
@Override 
public void onErrorResponse(VolleyError error) { 
    VolleyLog.d(TAG, "Error: " + error.getMessage()); 
    hidePDialog(); 

} 
}); 

    //Passing Data to UserDetailActivity 
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 
      int UserDetailActivity = 1; 
      Intent i = new Intent(UserListActivity.this, UserDetailActivity.class); 
      i.putExtra("user_id", userList.get(position)); 
      i.putExtra("firstname", userList.get(position)); 
      i.putExtra("lastname", userList.get(position)); 
      startActivityForResult(i, UserDetailActivity); 
     } 
    }); 

} 

// Adding request to request queue 
AppController.getInstance().addToRequestQueue(userReq); 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == 1 && resultCode == RESULT_OK) { 

     //Calling the volley method below 
     volleyRequest(); 

    } 
} 


//Collapsed volley method, same as onCreate 
public void volleyRequest() {...} 

UserDetailActivity

//Update Status 
private void updateStatus() { 

    SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE); 
    final String user_id = sharedPreferences.getString(Config.user_id,"Not Available"); 
    final String user_status = "ONLINE"; 

    StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.USERSTATUS_URL, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        Toast.makeText(UserDetailActivity.this, response, Toast.LENGTH_LONG).show(); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Toast.makeText(UserDetailActivity.this, error.getMessage(), Toast.LENGTH_LONG).show(); 
       } 
      }) { 
     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 
      Map<String, String> params = new HashMap<>(); 
      params.put("user_status", user_status); 
      params.put("user_id", user_id); 
      return params; 
     } 
    }; 

    RequestQueue requestQueue = Volley.newRequestQueue(this); 
    requestQueue.add(stringRequest); 

    //Calling method below 
    finishAndSetResult(); 

    //Intent intent = new Intent(this, UserListActivity.class); 
    //startActivity(intent); 
} 

private void finishAndSetResult() { 
    if (getParent() == null) { 
     setResult(RESULT_OK, null); 
    } else { 
     getParent().setResult(RESULT_OK, null); 
    } 
    finish(); 
} 

Mise à jour - Solution

Je réalise que j'utilisais deux demandes différentes. (?) Une avec ma classe AppController qui fait la mise à jour immédiate et une autre qui semble attendre jusqu'à ce qu'un autre événement sur le thread d'interface utilisateur a lieu:

// Correct one to use 
AppController.getInstance().addToRequestQueue(userReq); 

//Delayed 
RequestQueue requestQueue = Volley.newRequestQueue(this); 
requestQueue.add(stringRequest); 
+0

Donc, vous chargez un ListView avec une requête GET, puis vous ouvrez une nouvelle activité où vous modifiez l'origine de vos informations (DB) avec une requête POST, mais vous attendez alors que ListView être mis à jour une fois que vous revenez à l'activité qui le détient? Faites-moi savoir si j'ai l'idée de ce qu'est votre problème. – FerDensetsu

+0

Exactement !! J'ai besoin de le mettre à jour immédiatement pour refléter les changements dans la base de données. Est-ce que je ferais quelque chose avec onResume? – glokul

+0

Non, si vous ouvrez une nouvelle activité que vous pensez modifier ou renvoyer un résultat à l'activité qui l'appelle, vous devez faire quelque chose avec onActivityResult. Je vais expliquer dans une réponse. – FerDensetsu

Répondre

0

figured it out, mise à jour dans le message original. Il s'avère que je n'avais pas besoin de startActivityForResult() ou quelque chose comme ça comme suggéré. Merci d'essayer d'aider FerDensetsu :)

0

Vous devez appeler l'activité qui déclenche la demande de poste avec startActivityForResult:

int POST_ACTIVITY = 1; 
Intent i = new Intent(this, PostActivity.class); 
startActivityForResult(i, POST_ACTIVITY); 

Dans l'activité de votre poste, une fois que vous connaissez la demande au serveur sans erreur, vous pouvez appeler la méthode suivante pour terminer et revenir à l'activité listview:

private void finishAndSetResult() { 
    if (getParent() == null) { 
     setResult(RESULT_OK, null); 
    } else { 
     getParent().setResult(RESULT_OK, null); 
    } 
    finish(); 
} 

Retour à nouveau dans votre activité listview, remplacer la méthode onActivityResult:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == POST_ACTIVITY && resultCode == RESULT_OK) { 
     //Clear any data in your listview, relaunch the get request 
     //and populate it again 
    } 
} 
+0

Excellent, va essayer quand je rentre à la maison monsieur. – glokul

+0

OK J'ai ajouté le code suggéré mais je n'obtiens toujours pas le résultat. J'ai édité mon post original pour montrer où étaient mes modifications. Je me demande si mon placement des méthodes est incorrect? – glokul