Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android中的Listview按钮单击问题_Android_Android Listview_Android Adapter_Baseadapter - Fatal编程技术网

android中的Listview按钮单击问题

android中的Listview按钮单击问题,android,android-listview,android-adapter,baseadapter,Android,Android Listview,Android Adapter,Baseadapter,我使用的是列表视图,列表项中有一个名为“Order”的按钮。我想在用户按下按钮时显示“勾号”图像,并在用户再次按下按钮时隐藏它 我的问题是,当我点击第一项的按钮时,第四项和第八项的勾号图像也出现了 这是适配器中的onClickListener viewHolderItem.btnOrder.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {

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

我的问题是,当我点击第一项的按钮时,第四项和第八项的勾号图像也出现了

这是适配器中的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();
        }
    });
这个问题的原因是什么

更新:这是我的AdapteGetView方法

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;
}
public View getView(最终int位置、视图转换视图、视图组父视图){
最终ViewHolderItem ViewHolderItem;
if(convertView==null){
LayoutInflater充气器=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(右布局。部件\订单\鞋\行,空);
viewHolderItem=新的viewHolderItem();
viewHolderItem.tvName=(TextView)convertView.findViewById(R.id.tv\u组件\u订单\u鞋子\u名称);
viewHolderItem.tvPrice=(TextView)convertView.findViewById(R.id.tv\u组件\u订单\u鞋子\u价格);
viewHolderItem.tvDesc=(TextView)convertView.findViewById(R.id.tv\u组件\u订单\u鞋子\u说明);
viewHolderItem.ivPic=(ImageView)convertView.findViewById(R.id.iv\u组件\u订单\u鞋子\u图片);
viewHolderItem.ivTick=(ImageView)convertView.findViewById(R.id.iv\u组件\u订单\u鞋子\u tick);
viewHolderItem.spinnerSize=(微调器)convertView.findViewById(R.id.Spinner\u组件\u订单\u鞋码);
viewHolderItem.etQty=(EditText)convertView.findViewById(R.id.et\u组件\u订单\u鞋子\u数量);
viewHolderItem.btnOrder=(按钮)convertView.findViewById(R.id.btn\u组件\u订单\u鞋订单);
setTag(viewHolderItem);
}否则{
viewHolderItem=(viewHolderItem)convertView.getTag();
}
最终鞋=鞋业者获得(位置);
viewHolderItem.tvName.setText(shoe.getShoeName());
String text=String.valueOf(shoe.getPrice());
int integerPlaces=text.indexOf('.');
int decimalPlaces=text.length()-integerPlaces-1;
如果(小数位数==1){
viewHolderItem.tvPrice.setText(“Rs.”+text+0”);
}否则{
viewHolderItem.tvPrice.setText(“Rs.”+文本);
}
viewHolderItem.tvDesc.setText(shoe.getDesc());
位图bmp=AppControl.convertStringToBitmap(shoe.getImg());
viewHolderItem.ivPic.setImageBitmap(bmp);
int最小=shoe.getSmallestSize();
int最大=shoe.getLargestSize();
整数[]arr=getSizeArray(最小、最大);
ArrayAdapter=新的ArrayAdapter(mContext,android.R.layout.simple\u spinner\u dropdown\u item,arr);
viewHolderItem.spinnerSize.setAdapter(适配器);
viewHolderItem.btnOrder.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
布尔值isSelected=shoe.isSelected();
如果(当选){
viewHolderItem.ivTick.setImageDrawable(空);
isSelected=false;
}否则{
viewHolderItem.ivTick.setImageDrawable(mContext.getResources().getDrawable(R.drawable.tick));
isSelected=true;
}
鞋业者。获取(位置)。设置选择(isSelected);
obj.getAdapter().notifyDataSetChanged();
}
});
返回视图;
}

首次创建视图时,必须设置标记,以便:

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

您应该向每一行添加标记:

在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()。
位置
值变化非常频繁。因此,我们应该使用
viewHolderItem.getTag()
值来解决此问题

您可以发布整个适配器代码吗?当getview方法回收时会出现此类问题。可能会重复@chathura2020 Mmh您的问题是因为视图被回收而产生的。因此,在创建视图时设置标记并将其放入imageButton的视图中是正确的方法..shoeList(viewHolderItem).setSelected(isSelected)???鞋匠是一个骗子。viewHolderItem不是int。抱歉。。使用
showList(viewHolderItem.getTag()).setSelected(isSelected)