[英]Listview button click issue in android
我正在使用列表視圖,並且列表項中有一個名為“訂單”的按鈕。 我想在用戶按下按鈕時顯示一個“刻度”圖像,而在用戶再次按下按鈕時將其隱藏。
我的問題是,當我單擊第一項上的按鈕時,也會出現第四項和第八項的刻度圖像。
這是適配器中的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();
}
});
這個問題的原因是什么?
更新:這是我的Adapte getview方法
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;
}
首次創建視圖時,必須設置標簽,以便:
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()。 position
值變化非常頻繁。 所以我們應該使用viewHolderItem.getTag()
值來解決這個問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.