我正在我的应用程序中实现购物车。在我的购物车视图中,我有一个带有editText的产品列表,因此用户可以更改其数量。 我需要收听“数量变化”事件,以便我可以相应地更新我的购物车对象。
我正在尝试使用onTextChanged事件但它没有按预期工作。就在我打开购物车视图时,事件被触发了几十次并完全打破了我的产品数量值。
如何确保真正改变价值?
这是我的代码:
我的CartItemsListAdapter(负责渲染购物车的每一行)。
public class CartItemsListAdapter extends ArrayAdapter<CartItem> implements OnClickListener{
private ArrayList<CartItem> cartItems;
/**
* view holder for caching the view elements
*/
static class CartItemViewHolder {
TextView tvProductName;
TextView tvShopName;
TextView tvSubTotal;
EditText edQuantity;
Button btnRemoveFromCart;
ImageView ivProduct;
}
/**
* default constructor
* @param context
* @param textViewResourceId
* @param cartItems
*/
public CartItemsListAdapter(Context context, int textViewResourceId,
ArrayList<CartItem> cartItems) {
super(context, textViewResourceId, cartItems);
this.cartItems = cartItems;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CartItemViewHolder viewHolder;
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.cart_item, null);
viewHolder = new CartItemViewHolder();
viewHolder.tvProductName = (TextView) v.findViewById(R.id.cart_item_product_name);
viewHolder.tvShopName = (TextView)v.findViewById(R.id.cart_item_shop_name);
viewHolder.tvSubTotal= (TextView)v.findViewById(R.id.cart_item_subtotal);
viewHolder.edQuantity = (EditText)v.findViewById(R.id.cart_item_product_quantity);
//viewHolder.btnRemoveFromCart = (Button)v.findViewById(R.id.cart_item_remove_item);
viewHolder.ivProduct = (ImageView)v.findViewById(R.id.cart_item_product_image);
v.setTag(viewHolder);
}else{
viewHolder = (CartItemViewHolder) v.getTag();
}
CartItem item = cartItems.get(position);
if(item != null){
viewHolder.tvProductName.setText(item.getProduct().getName());
viewHolder.edQuantity.setText(Integer.toString(item.getQuantity()));
viewHolder.tvSubTotal.setText(Double.toString(item.getSubTotal()));
viewHolder.tvShopName.setText(item.getProduct().getShop().getName());
UrlImageViewHelper.setUrlDrawable(viewHolder.ivProduct, item.getProduct().getImage());
viewHolder.edQuantity.addTextChangedListener(new CartItemQuantityChangeListener(cartItems,item));
}
return v;
}
@Override
public int getCount() {
return cartItems.size();
}
@Override
public CartItem getItem(int position) {
return cartItems.get(position);
}
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
}
我的TextChanged侦听器类
public class CartItemQuantityChangeListener implements TextWatcher {
private ArrayList<CartItem> cartItems;
private CartItem item;
public CartItemQuantityChangeListener(ArrayList<CartItem> cartItems,
CartItem item) {
this.cartItems = cartItems;
this.item = item;
}
public void afterTextChanged(Editable s) {
try {
int quantity = Integer.parseInt(s.toString());
Log.d(Constants.LOG_TAG, "quantity changed" + quantity);
int index = this.cartItems.indexOf(item);
Log.d(Constants.LOG_TAG, "INDEX" + index);
// this.cartItems.get(index).setQuantity(quantity);
/*
* for(CartItem i : this.cartItems){
* Log.d(Constants.LOG_TAG,item.getProduct().getName() + " : " +
* i.getQuantity()); }
*/
} catch (NumberFormatException ex) {
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}
答案 0 :(得分:1)
将编辑文本中写入的最后一个值保存在String中,并且每次调用onTextChanged时,都要将新值与旧值进行比较。如果新值不同,那就做点什么吧。如果它的价值相同,你什么都不做
答案 1 :(得分:1)
您应该从代码中的get view方法中删除此行。
viewHolder.edQuantity.addTextChangedListener(new
CartItemQuantityChangeListener(cartItems,item));
然后不是 为每个视图添加多个textwatcher ..添加上面的行 在适配器构造函数中,它将正常工作..
答案 2 :(得分:0)
我想每次构建新视图时,都会向TextWatcher
添加新的TextView
。因此,最后,afterTextChanged
方法被调用的次数等于列表中的项目数。