Android ListView Onclick Intent数据延迟(第二次点击工作)

时间:2016-05-18 01:09:56

标签: android listview android-intent android-activity android-volley

当我点击ListView中的项目时,我想显示项目详细信息,这些详细信息是通过Volley从数据库获得的。我完成了代码,但问题是: 它只能在第二次点击时工作。 例如,当我单击 item1 (data-> Intent)时,跳转到详细信息Activity,但仅显示默认布局(视图中的每个元素都为null)。然后点击返回上一个ListView并点击 item1 所有内容显示。 现在,如果我点击 item2 ,它会在详情页面中显示 item1 。返回ListView,单击 item2 ,将显示item2。

这是我的代码: 的的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

2 个答案:

答案 0 :(得分:2)

对于您的情况: 正如我所见,您在数据库中读取数据并等待响应回调。但是,如果您还没有接到回电话,那么您应用电话会转到其他活动,这就是您没有看到任何内容的原因。

您可以像这样更新:

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

答案 1 :(得分:1)

您通过Volley从数据库获取数据,因此需要一些时间才能获得成功。 因此,如果数据尚未成功,并且您将其传递给下一个Activity,则您将在下一个Activity中获得空值

<强>解决方案
你需要等到数据成功 之后,通过Intent

将其传递给下一个Activity
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() {
        ...
}