listview onclick listener给出了错误的行项

时间:2015-02-23 14:51:57

标签: android listview

我的应用流程存在问题。

我的一个片段中有一个ListView。 我们已经创建了一个自定义适配器来使用JSON填充来自Web服务的数据。 (扩展了BaseAdapter)

当我设置OnClick时,它还有其他组件,如EditText和按钮。

我们创建了OnClickListerner(),它可以正确处理数据。但是,我希望在同一行中获得下一个元素。位置值给出错误的行对象。

我写的示例代码实现了这一点。请检查我是否在拨打电话时犯了错误。 (我正在从数组中正确地获取数据,但单独的对象是错误的)。

add_to_cart.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

               int p = position;

            Integer pos = (Integer) arg0.getTag();
            SKU_CODE = data.get(pos).get("sku_code");
            SKU_NAME = data.get(pos).get("sku_name");
            sp = PreferenceManager.getDefaultSharedPreferences(activity);
            LOGGED = sp.getBoolean("LOGGED", false);
            USER_ID = sp.getString("USER_ID", "");
            STORE_CODE = sp.getString("STORE_CODE", "985");
            url = "http://foodworld.in/android-api/add_item_to_cart.php";
            //Toast.makeText(activity, url, Toast.LENGTH_SHORT).show();
            Log.d("add to cart ur: ", url);
            add_to_cart.setVisibility(View.GONE);

            //qty_change_row.setTag(pos);

            qty_change_row.setVisibility(View.VISIBLE);

            AddItemToShoppingCart newTask = new AddItemToShoppingCart(arg0, pos);
            newTask.execute();

            }
        });

在该代码中,我们有" add_to_cart_row"。这是线性布局,我们在这里指的是id。我尝试设置可见性,但它没有工作;它设置了错误的对象(屏幕中其他行中的对象)。

在附带的屏幕截图中,我点击了第一个产品的“添加到购物车”按钮。它启用了最后一行中的元素(+ - 文本框)。

这是我的问题。请帮帮我。

2 个答案:

答案 0 :(得分:0)

首先,

我对Integer pos = (Integer) arg0.getTag(); pos有疑问,因为适配器' getView()返回回收视图,因此您可能会得到错误的数据位置,

因此,您可以使用int p = position;

代替它

像,

int p = position;
SKU_CODE = data.get(p).get("sku_code");
SKU_NAME = data.get(p).get("sku_name");

第二次使用if - else add_to_cart可见性。

像,

if(//Some condition)
{
  add_to_cart.setVisibility(View.GONE);
  qty_change_row.setVisibility(View.VISIBLE);
}
else
{
 add_to_cart.setVisibility(View.VISIBLE);
 qty_change_row.setVisibility(View.GONE);
}

答案 1 :(得分:0)

用setOnItemClickListener替换onClick。

示例:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               ...
            }
        });

您可以通过以下方式从列表视图中获取价值或位置:

  list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
          @Override
          public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
             QuestionItem questionItem = (QuestionItem)parent.getItemAtPosition(position);

             if(questionItem.id == 1){
              //do something
             }
             if(position == 2){
             // do something
             }
          }
  });

QuestionItem是ListAdapter的对象:

private class QuestionItem{
        private int id;

        public QuestionItem(int id){
            this.id = id;
        }
    }