在Android的列表视图按钮点击问题 [英] Listview button click issue in android

查看:300
本文介绍了在Android的列表视图按钮点击问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用一个列表视图,有一个名为列表项订单按钮。我想显示嘀的形象,当用户presses按钮,隐藏在用户$ P $再次psses按钮。

我的问题是,当我在按钮上点击了第一项,选中第4,8项的形象也出现了。

这是onClickListener在适配器,

  viewHolderItem.btnOrder.setOnClickListener(新OnClickListener(){        @覆盖
        公共无效的onClick(视图v){
            布尔isSelected = shoe.isSelected();            如果(isSelected){
                viewHolderItem.ivTick.setImageDrawable(NULL);
                isSelected = FALSE;
            }其他{
                viewHolderItem.ivTick.setImageDrawable(mContext.getResources()getDrawable(R.drawable.tick));
                isSelected = TRUE;
            }            shoeList.get(位置).setSelected(isSelected);
            obj.getAdapter()notifyDataSetChanged()。
        }
    });

什么是这个问题的原因是什么?

更新:这是我adapte getview方法

 公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){    最后ViewHolderItem viewHolderItem;    如果(convertView == NULL){
        LayoutInflater吹气=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.component_order_shoe_row,NULL);        viewHolderItem =新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 =(微调)convertView.findViewById(R.id.spinner_component_order_shoe_size);
        viewHolderItem.etQty =(EditText上)convertView.findViewById(R.id.et_component_order_shoe_qty);
        viewHolderItem.btnOrder =(按钮)convertView.findViewById(R.id.btn_component_order_shoe_order);        convertView.setTag(viewHolderItem);    }其他{
        viewHolderItem =(ViewHolderItem)convertView.getTag();
    }    最后擦鞋鞋= shoeList.get(位置);
    viewHolderItem.tvName.setText(shoe.getShoeName());    字符串文本=将String.valueOf(shoe.getPrice());
    INT integerPlaces = text.indexOf('。');
    INT小数位数= text.length() - integerPlaces - 1;
    如果(小数位数== 1){
        viewHolderItem.tvPrice.setText(RS+文字+0);
    }其他{
        viewHolderItem.tvPrice.setText(RS+文字);
    }
    viewHolderItem.tvDesc.setText(shoe.getDesc());    BMP位图= AppControl.convertStringToBitmap(shoe.getImg());
    viewHolderItem.ivPic.setImageBitmap(BMP);    诠释最小= shoe.getSmallestSize();
    诠释最大= shoe.getLargestSize();    整数[] = ARR getSizeArray(最小,最大);
    ArrayAdapter<整数GT;适配器=新ArrayAdapter<整数GT;(mContext,android.R.layout.simple_spinner_dropdown_item,ARR);
    viewHolderItem.spinnerSize.setAdapter(适配器);
    viewHolderItem.btnOrder.setOnClickListener(新OnClickListener(){        @覆盖
        公共无效的onClick(视图v){
            布尔isSelected = shoe.isSelected();            如果(isSelected){
                viewHolderItem.ivTick.setImageDrawable(NULL);
                isSelected = FALSE;
            }其他{
                viewHolderItem.ivTick.setImageDrawable(mContext.getResources()getDrawable(R.drawable.tick));
                isSelected = TRUE;
            }            shoeList.get(位置).setSelected(isSelected);
            obj.getAdapter()notifyDataSetChanged()。
        }
    });    返回convertView;
}


解决方案

您必须设置标记时首次所以创建的视图:

 如果(convertView == NULL){
    LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    // code    viewHolderItem.btnOrder =(的ImageButton)rowView.findViewById(R.id.imageButton);    viewHolderItem.btnOrder.setTag(viewHolder); //设置标签的按钮
    convertView.setTag(viewHolder);
}其他{
    viewHolderItem =(ViewHolder)convertView.getTag();
}

和获得它的点击监听器里:

  viewHolderItem.btnOrder.setOnClickListener(新OnClickListener(){
     @覆盖
     公共无效的onClick(视图v){
         viewHolderItem =(ViewHolder)v.getTag(); //获取标签内的点击
         布尔isSelected = shoe.isSelected();         如果(isSelected){
            viewHolderItem.ivTick.setImageDrawable(NULL);
            isSelected = FALSE;
         }其他{
            viewHolderItem.ivTick.setImageDrawable(mContext.getResources()getDrawable(R.drawable.tick));
            isSelected = TRUE;
         }         shoeList.get(位置).setSelected(isSelected);
         obj.getAdapter()notifyDataSetChanged()。
    }
});

I'm using a list view and there is a button called "Order" in the list item. I want to show a "tick" image when the user presses the button and hide it when the user presses the button again.

My issue is when I clicked on the button on the first item, tick image of the 4th and 8th item is also appeared.

This is the onClickListener in the 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();
        }
    });

What is the reason for this issue?

update: This is my adapte getview method

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

解决方案

You have to set the tag when the view is created for the first time so:

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

And get it inside the click listener:

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

这篇关于在Android的列表视图按钮点击问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆