1

Ich möchte eine Artikeldetails anzeigen, wenn ich auf ein Element in ListView klicke, diese Details wurden aus der Datenbank über Volley erhalten. Ich beendete den Code, aber das Problem ist: Es funktioniert nur in der zweiten Zeit klicken. Zum Beispiel, wenn ich auf item1 (Daten-> Intent) klicken, springen Sie zu Details Aktivität, aber es zeigen nur das Standardlayout (jedes Element in Sicht ist Null). Klicken Sie dann zurück zum vorherigen ListView und klicken Sie auf item1, alles anzeigen. Wenn ich nun auf item2 klicke, wird item1 auf der Detailseite angezeigt. Zurück zu ListView klicken item2, wird item2 anzeigen.Android ListView Onclick Intent Datenverzögerung (Arbeit beim zweiten Mal klicken)

Hier ist mein Code: Listview:

 lvResults.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      /** 
      * get data from db based on id_product 
      */ 
      Bean bean = resultAdapter.getItem(position);//GET ITEM POSITION 
      getPromotionById(bean.getIdProduct());//GET DATA JSONOBJECT FROM DATABASE via Volley 

      Intent intent = new Intent(ListActivity.this, DetailsActivity.class); 
      intent.putExtra("item", itemToPass); 
      startActivity(intent); 
     } 
    }); 

getPromotionById (String id_product)

private void getPromotionById(String id_product) { 
    Map<String, String> map = new HashMap<String, String>(); 
    map.put("id_product",id_product); 

    CustomRequest jsonObjectRequest = new CustomRequest(Request.Method.POST, showUrl,map,new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      try { 
       JSONObject promotion = response.getJSONObject("product"); 
       itemToPass.setIdProduct(promotion.getString("id_product")); 
       itemToPass.setTitle(promotion.getString("name")); 
      } 
      catch (JSONException e) {e.printStackTrace();} 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) {}}); 
     requestQueue.add(jsonObjectRequest); 
} 

DetailActivity:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    item = new Item(); 
    item = (Item) getIntent().getSerializableExtra("item"); 

    setContentView(R.layout.item_detail_1); 

    itemTitle = (TextView) findViewById(R.id.title); 
    setData(item); 
} 
private void setData(Item item) { 
    new DownloadImageTask((ImageView) findViewById(R.id.img)) 
      .execute("url"); 
    itemTitle.setText(item.getTitle()); 
} 

1st click

2nd click

+0

ViewHolder Muster verwenden? –

Antwort

1

Sie Daten aus der Datenbank über Volley bekommen, so dass es einige Zeit brauchen, um erfolgreich zu bekommen. Deshalb, wenn die Daten noch nicht erfolgreich, und Sie es zum nächsten Activity passieren, werden Sie Nullwert in Activity nächste erhalten

Lösung
Sie müssen warten, bis die Daten erfolgreich erhalten
Nach das, Sie übergeben es nächste Activity über Intent

CustomRequest jsonObjectRequest = new CustomRequest(Request.Method.POST, showUrl,map,new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      try { 
       JSONObject promotion = response.getJSONObject("product"); 
       itemToPass.setIdProduct(promotion.getString("id_product")); 
       itemToPass.setTitle(promotion.getString("name")); 

       // Move Intent to here 
       Intent intent = new Intent(ListActivity.this, DetailsActivity.class); 
       intent.putExtra("item", itemToPass); 
       startActivity(intent); 
      } 
      ... 
     } 
    }, new Response.ErrorListener() { 
     ... 
} 
+0

Vielen Dank! Es funktioniert jetzt –

2

Für Ihren Fall: Wie ich sehen, lesen Sie Ihre Daten in der Datenbank und Antwort Anklopf zurück. Aber wenn Sie noch keinen Rückruf erhalten haben, gehen Sie zu einer anderen Aktivität, dann sehen Sie nichts.

Sie können wie folgt aktualisiert:

private void getPromotionById(String id_product) { 
    Map<String, String> map = new HashMap<String, String>(); 
    map.put("id_product",id_product); 

    CustomRequest jsonObjectRequest = new CustomRequest(Request.Method.POST, showUrl,map,new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      try { 
       JSONObject promotion = response.getJSONObject("product"); 
       itemToPass.setIdProduct(promotion.getString("id_product")); 
       itemToPass.setTitle(promotion.getString("name")); 

       //after receive call back, you can start your activity instead of start right after call function read database 
       Intent intent = new Intent(ListActivity.this, DetailsActivity.class); 
       intent.putExtra("item", itemToPass); 
       startActivity(intent); 
       }catch (JSONException e) {e.printStackTrace();} 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) {} 
     }); 
     requestQueue.add(jsonObjectRequest); 
    } 
+0

Vielen Dank :) –

Verwandte Themen