列表视图中的 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
但在 onItemSelected
中 shoeSize
使用:
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));
我在 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
但在 onItemSelected
中 shoeSize
使用:
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));