Android:GridView在后续点击中打开相同的条目(第一个单击的条目)

时间:2016-12-17 04:25:16

标签: android android-layout gridview

如果问题太长,我会提前道歉。我们走了:

MainActivity:托管GridView的活动,其中包含产品列表

ProductDetailActivity:点击后显示GridView中所选项目详情的活动

ProductMainAdapter: GridView

中产品数据的适配器类
The workflow: 

1 - 用户打开应用程序,主要活动开始(launchMode="singleTask"),其中包含使用Volley从服务器查询的产品列表,并列在GridView中。查询的数据仅包括productID和图像。

2 - 用户点击GridView上的任何产品(项目),所选产品ID用于从服务器(Volley)获取详细信息并打开ProductDetailActivity,意图是选择了产品数据。

3 - 用户查看详细信息并返回MainActivity并选择其他项目。并继续这样。

此工作流程在%95个用户设备中完美运行。但每隔一段时间我就会收到一条用户的消息,总结说:"第一个点击的产品会在后续点击中保持打开状态"。例如,用户单击项目X,并打开X的详细信息。然后用户转到main并单击项目Y,但项目X再次打开。我在模拟器中使用所有可用的Android版本在过去几周内测试了15到25个版本。我也用我能找到的所有设备对它进行了测试,但是无法重现这个问题。用户发送了一个显示问题的视频,这是一个真正的问题。

Adapter中的相关代码段如下:

public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
...

holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                openProductDetail(position);
            }
        });
...
}

private void openProductDetail(int position) {

    if(!Connectivity.isConnected(getContext())) {
        CommonUtil.buildDialog(getContext(), getContext().getResources().getString(R.string.no_network_title),
                getContext().getResources().getString(R.string.no_network_msg)).show();
        return;
    }

    try {
        ImageRecord imr = getItem(position);
        String productID = imr != null ? imr.getId() : "0";
        getProductDetail(productID);

    } catch (Exception e) {
        Log.e("openProductDetail", "exception", e);
    }
}

private void getProductDetail(final String productID) {

        ...

        StringRequest postRequest = new StringRequest(Request.Method.POST, Config.PRODUCT_DETAIL_URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            if(response != null && !response.equals("")) {
                                Intent intent = new Intent(getContext(), ProductDetailActivity.class);
                                intent.putExtra("pid", productID);
                                intent.putExtra("jsonObject", response);

                                getContext().startActivity(intent);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        error.printStackTrace();
                    }
                }
        ) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<>();
                params.put("id", productID);
                ...
                return params;
            }
        };

        RetryPolicy policy = new DefaultRetryPolicy(1000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
        postRequest.setRetryPolicy(policy);
        CustomVolleyRequest.getInstance(getContext()).getRequestQueue().add(postRequest);
    }

ProductDetailActivity代码是:

protected void onResume() {
        super.onResume();
        ...

        productID = getIntent().getStringExtra("pid");
        jsonObject = getIntent().getStringExtra("jsonObject");

...
}

由于我无法重现该问题,因此无法对其进行调试。我可以要求用户给我他们的手机进行测试,他们住在另一个国家。

GridView正在缓存第一次点击并继续返回,或者产品详细信息活动因某种原因兑现其数据。我尝试使用onItemClickListener()的{​​{1}}但是没有用。我还尝试仅将productID发送到详细活动并从新活动中删除详细信息。那也行不通。有没有人遇到类似的情况?任何建议或评论都非常感谢。

谢谢

0 个答案:

没有答案