2015-04-04 85 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));