2015-04-04 86 views
1

我有一个按钮和微调ListView项目。我已将下面的代码放在Spinner的setOnItemSelectedListener中。问题与微调列表视图

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

但它在setOnItemSelectedListener内部没有改变。但是当我把相同的代码放在按钮的setOnClickListener里面时,它会自动改变对象的值。这是什么原因?

GetView方法:

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

回答

3

您在这里犯了一个错误:

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

为shoeList的position值是不一样的shoeSize Spinner项目position值。尝试将onItemSelected方法position名称参数更改为类似pos。因此,让你的getView继续使用final int positiononItemSelectedshoeSize使用:

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

仍然没有正在运行 – chathura 2015-04-04 03:52:58

+0

您可以发布一些更多的代码吗?... – electrocrat 2015-04-04 03:57:29

+0

我添加了getView方法。 PLZ检查 – chathura 2015-04-04 04:05:39

0

里面你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.setTag(位置)设置标签viewHolderItem.spinnerSize做到这一点和onItemSelected内即可获得通过(整数)的位置parent.getTag(),如:

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