【问题标题】:Listview button click issue in androidandroid中的Listview按钮点击问题
【发布时间】:2015-03-21 10:11:34
【问题描述】:

我正在使用列表视图,并且列表项中有一个名为“订购”的按钮。我想在用户按下按钮时显示“勾号”图像,并在用户再次按下按钮时隐藏它。

我的问题是当我单击第一项上的按钮时,还出现了第 4 项和第 8 项的勾号图像。

这是适配器中的onClickListener,

    viewHolderItem.btnOrder.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            boolean isSelected = shoe.isSelected();

            if(isSelected){
                viewHolderItem.ivTick.setImageDrawable(null);
                isSelected = false;
            }else{
                viewHolderItem.ivTick.setImageDrawable(mContext.getResources().getDrawable(R.drawable.tick));
                isSelected = true;
            }

            shoeList.get(position).setSelected(isSelected);
            obj.getAdapter().notifyDataSetChanged();
        }
    });

这个问题的原因是什么?

更新:这是我的适配 getview 方法

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

    final ViewHolderItem viewHolderItem;

    if(convertView == null){
        LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.component_order_shoe_row,null);

        viewHolderItem = new ViewHolderItem();

        viewHolderItem.tvName = (TextView)convertView.findViewById(R.id.tv_component_order_shoe_name);
        viewHolderItem.tvPrice = (TextView)convertView.findViewById(R.id.tv_component_order_shoe_price);
        viewHolderItem.tvDesc = (TextView)convertView.findViewById(R.id.tv_component_order_shoe_description);
        viewHolderItem.ivPic = (ImageView)convertView.findViewById(R.id.iv_component_order_shoe_pic);
        viewHolderItem.ivTick = (ImageView)convertView.findViewById(R.id.iv_component_order_shoe_tick);
        viewHolderItem.spinnerSize = (Spinner)convertView.findViewById(R.id.spinner_component_order_shoe_size);
        viewHolderItem.etQty = (EditText)convertView.findViewById(R.id.et_component_order_shoe_qty);
        viewHolderItem.btnOrder = (Button)convertView.findViewById(R.id.btn_component_order_shoe_order);

        convertView.setTag(viewHolderItem);

    }else{
        viewHolderItem = (ViewHolderItem)convertView.getTag();
    }

    final Shoe shoe = shoeList.get(position);
    viewHolderItem.tvName.setText(shoe.getShoeName());

    String text = String.valueOf(shoe.getPrice());
    int integerPlaces = text.indexOf('.');
    int decimalPlaces = text.length() - integerPlaces - 1;
    if(decimalPlaces==1){
        viewHolderItem.tvPrice.setText("Rs."+ text + "0");
    }else{
        viewHolderItem.tvPrice.setText("Rs."+ text);
    }
    viewHolderItem.tvDesc.setText(shoe.getDesc());

    Bitmap bmp = AppControl.convertStringToBitmap(shoe.getImg());
    viewHolderItem.ivPic.setImageBitmap(bmp);

    int smallest = shoe.getSmallestSize();
    int largest = shoe.getLargestSize();

    Integer[] arr = getSizeArray(smallest,largest);
    ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(mContext, android.R.layout.simple_spinner_dropdown_item,arr);
    viewHolderItem.spinnerSize.setAdapter(adapter);


    viewHolderItem.btnOrder.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            boolean isSelected = shoe.isSelected();

            if(isSelected){
                viewHolderItem.ivTick.setImageDrawable(null);
                isSelected = false;
            }else{
                viewHolderItem.ivTick.setImageDrawable(mContext.getResources().getDrawable(R.drawable.tick));
                isSelected = true;
            }

            shoeList.get(position).setSelected(isSelected);
            obj.getAdapter().notifyDataSetChanged();
        }
    });

    return convertView;
}

【问题讨论】:

标签: android android-listview android-adapter baseadapter


【解决方案1】:

您必须在第一次创建视图时设置标签:

if(convertView==null){
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    //code

    viewHolderItem.btnOrder= (ImageButton)rowView.findViewById(R.id.imageButton);

    viewHolderItem.btnOrder.setTag(viewHolder); //set the tag for the button
    convertView.setTag(viewHolder);
} else {
    viewHolderItem = (ViewHolder) convertView.getTag();
}

并在点击监听器中获取它:

viewHolderItem.btnOrder.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {
         viewHolderItem = (ViewHolder) v.getTag(); //get the tag inside on click
         boolean isSelected = shoe.isSelected();

         if(isSelected){
            viewHolderItem.ivTick.setImageDrawable(null);
            isSelected = false;
         }else{
            viewHolderItem.ivTick.setImageDrawable(mContext.getResources().getDrawable(R.drawable.tick));
            isSelected = true;
         }

         shoeList.get(position).setSelected(isSelected);
         obj.getAdapter().notifyDataSetChanged();
    }
});

【讨论】:

  • @chathura2020 嗯,您的问题是因为视图被回收而产生的。因此,在创建视图时设置标签并将其放在 imageButton 的视图中将是正确的方法..
【解决方案2】:

你应该为每一行添加标签:

在 getView 方法中:

viewHolderItem.setTag(viewHolderItem);

在Show类中添加getId()方法并返回id

像这样改变 onclick 监听器:

viewHolderItem.btnOrder.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        boolean isSelected = shoe.isSelected();

        if(isSelected){
            viewHolderItem.ivTick.setImageDrawable(null);
            isSelected = false;
        }else{
            viewHolderItem.ivTick.setImageDrawable(mContext.getResources().getDrawable(R.drawable.tick));
            isSelected = true;
        }

        showList(viewHolderItem.getTag()).setSelected(isSelected);
        obj.getAdapter().notifyDataSetChanged();
    }
});

出现问题是因为当您向上/向下滚动时,每行(即第 4、5 行等)都会调用 getView()。所以。 position 值变化非常频繁。所以我们应该使用viewHolderItem.getTag() 值来解决这个问题

【讨论】:

  • shoeList(viewHolderItem).setSelected(isSelected); ??? shoeList 是一个数组列表。 viewHolderItem 不是 int。
  • 对不起.. 使用showList(viewHolderItem.getTag()).setSelected(isSelected);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多