列表视图中的 Spinner 问题

Issue with Spinner in the Listview

我在 ListView 项中有一个按钮和微调器。我已将以下代码放入 Spinner 的 setOnItemSelectedListener 中。

    String val = viewHolderItem.spinnerSize.getSelectedItem().toString();
    shoeList.get(position).setSelectedSize(Integer.parseInt(val));

但在setOnItemSelectedListener 内部并没有改变。但是,当我将相同的代码放入 Button 的 setOnClickListener 中时,它就开始工作并更改了对象的值。这是什么原因?

获取视图方法:

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

    final ViewHolderItem viewHolderItem;

    final Shoe shoe = shoeList.get(position);

    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);
        viewHolderItem.btnOrder.setTag(viewHolderItem);

        convertView.setTag(viewHolderItem);

    }else{
        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;
    if(decimalPlaces==1){
        viewHolderItem.tvPrice.setText("Rs."+ text + "0");
    }else{
        viewHolderItem.tvPrice.setText("Rs."+ text);
    }

    if(shoe.isSelected()){
        viewHolderItem.ivTick.setImageDrawable(mContext.getResources().getDrawable(R.drawable.tick));
        viewHolderItem.btnOrder.setText(mContext.getResources().getString(R.string.btn_remove_shoe_item));
    }else{
        viewHolderItem.ivTick.setImageDrawable(null);
        viewHolderItem.btnOrder.setText(mContext.getResources().getString(R.string.btn_order_shoes));
    }

    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) {

            ViewHolderItem viewHolder = ((ViewHolderItem) v.getTag());
            boolean isSelected = shoe.isSelected();

            if(isSelected){
                ((Button)v).setText(mContext.getResources().getString(R.string.btn_order_shoes));
                viewHolder.ivTick.setImageDrawable(null);
                viewHolder.etQty.setEnabled(true);
                isSelected = false;
            }else{
                ((Button)v).setText(mContext.getResources().getString(R.string.btn_remove_shoe_item));
                viewHolder.ivTick.setImageDrawable(mContext.getResources().getDrawable(R.drawable.tick));
                viewHolder.etQty.setEnabled(false);
                isSelected = true;
            }

            shoeList.get(position).setSelected(isSelected);

            String input = viewHolderItem.etQty.getText().toString();

            if(isEnteredValueNumeric(input)){
                shoeList.get(position).setQty(Integer.parseInt(input));
            }else{
                shoeList.get(position).setQty(1);
                AppControl.showToastMessage(mContext,Constant.MSG_NOT_A_NUMBER);
                viewHolderItem.etQty.setText(String.valueOf(1));
            }

            String val = viewHolderItem.spinnerSize.getSelectedItem().toString();
            shoeList.get(position).setSelectedSize(Integer.parseInt(val));

        }
    });

    viewHolderItem.spinnerSize.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            String val = parent.getItemAtPosition(position).toString();
            shoeList.get(position).setSelectedSize(Integer.parseInt(val));
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {}
    });

    return convertView;
}

你在这里犯了一个错误:

String val = parent.getItemAtPosition(position).toString();
shoeList.get(position).setSelectedSize(Integer.parseInt(val));

shoeList 的 position 值与 shoeSize Spinner 项目的 position 值不同。尝试将 onItemSelected 方法 position 名称参数更改为类似 pos 的内容。所以让你的 getView 继续使用 final int position 但在 onItemSelectedshoeSize 使用:

public void onItemSelected(AdapterView<?> parent,
        View view, int pos, long id) {
    String val = parent.getItemAtPosition(pos)
            .toString();
    shoeList.get(position).setSelectedSize(
            Integer.parseInt(val));
}

在你的 onClickListener 中,它们不是 onClickMethod 中整数位置的任何参数:

 @Override
        public void onClick(View v) {
/* so this position in shoeList.get(position) returns the position of the 
 * list view item i.e you array list exact position*/
shoeList.get(position).setSelectedSize(Integer.parseInt(val));
}

但在您的 onItemSelected 中,它们的位置值已经存在,因此您可能需要更改其参数名称,例如:

public void onItemSelected(AdapterView<?> parent,
        View view, int pos, long id) {
// just like @electrocrat insist
    String val = parent.getItemAtPosition(pos)
            .toString();
    shoeList.get(position).setSelectedSize(
            Integer.parseInt(val));
}

您也可以通过将标签设置为 viewHolderItem.spinnerSize 来做到这一点 viewHolderItem.spinnerSize.setTag(position) 在 onItemSelected 中你可以通过 (Integer)parent.getTag() 获取位置,比如:

shoeList.get((Integer)parent.getTag()).setSelectedSize(
                Integer.parseInt(val));