android editText-ContextChanged调用了几十次,即使没有更改任何文本

android editText-ContextChanged调用了几十次,即使没有更改任何文本,android,android-edittext,Android,Android Edittext,我正在我的应用程序中实现一个购物车。在我的购物车视图中,我有一个带有editText的产品列表,因此用户可以更改其数量。 我需要监听“数量更改”事件,以便相应地更新我的购物车对象 我正在尝试使用onTextChanged事件,但它没有按预期工作。就在我打开购物车视图时,事件被触发了几十次,完全破坏了我的产品数量值 如何确保该值确实已更改 这是我的密码: My CartItemsListAdapter(负责呈现购物车的每一行)。 public class CartItemsListAdapter

我正在我的应用程序中实现一个购物车。在我的购物车视图中,我有一个带有editText的产品列表,因此用户可以更改其数量。 我需要监听“数量更改”事件,以便相应地更新我的购物车对象

我正在尝试使用onTextChanged事件,但它没有按预期工作。就在我打开购物车视图时,事件被触发了几十次,完全破坏了我的产品数量值

如何确保该值确实已更改

这是我的密码:

My 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

    }

}
公共类CartItemsListAdapter扩展ArrayAdapter实现OnClickListener{
私有数组列表项;
/**
*用于缓存视图元素的视图保持架
*/
静态类CartItemViewHolder{
TextView tvProductName;
文本视图tvShopName;
TextView-tv小计;
编辑文本数量;
按钮btnRemoveFromCart;
ImageView产品;
}
/**
*默认构造函数
*@param上下文
*@param textViewResourceId
*@param cartItems
*/
公共CartItemsListAdapter(上下文上下文,int textViewResourceId,
ArrayList(项目){
超级(上下文、textViewResourceId、cartItems);
this.cartItems=cartItems;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
CartItemViewHolder视图持有者;
视图v=转换视图;
如果(v==null){
LayoutInflater vi=(LayoutInflater)getContext().getSystemService(
上下文。布局(充气机和服务);
v=vi.充气(R.布局.购物车项目,空);
viewHolder=新的CartItemViewHolder();
viewHolder.tvProductName=(TextView)v.findViewById(R.id.cart\u item\u product\u name);
viewHolder.tvShopName=(TextView)v.findViewById(R.id.cart\u item\u shop\u name);
viewHolder.tvSubTotal=(TextView)v.findViewById(R.id.cart\u item\u subtotal);
viewHolder.edQuantity=(EditText)v.findViewById(R.id.cart\u item\u product\u quantity);
//viewHolder.btnRemoveFromCart=(按钮)v.findViewById(R.id.cart\u item\u remove\u item);
viewHolder.ivProduct=(ImageView)v.findViewById(R.id.cart\u item\u product\u image);
v、 setTag(视图持有者);
}否则{
viewHolder=(CartItemViewHolder)v.getTag();
}
CartItem=cartItems.get(位置);
如果(项!=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(新的CartItemQuantityChangeListener(cartItems,item));
}
返回v;
}
@凌驾
public int getCount(){
返回cartItems.size();
}
@凌驾
公共CartItem getItem(内部位置){
返回cartItems.get(位置);
}
公共void onClick(视图arg0){
//TODO自动生成的方法存根
}
}
我的文本更改侦听器类

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) {

    }

}
公共类CartItemQuantityChangeListener实现TextWatcher{
私有数组列表项;
私人物品;
公共CartItemQuantityChangeListener(ArrayList cartItems,
CartItem(项目){
this.cartItems=cartItems;
this.item=项目;
}
公共无效后文本已更改(可编辑){
试一试{
int quantity=Integer.parseInt(s.toString());
Log.d(Constants.Log_标签,“数量更改”+数量);
int index=this.cartItems.indexOf(item);
Log.d(Constants.Log_标记,“索引”+索引);
//this.cartItems.get(index).setQuantity(quantity);
/*
*对于(CartItem i:this.cartItems){
*Log.d(Constants.Log_标记,item.getProduct().getName()+”:“+
*i.getQuantity());}
*/
}捕获(NumberFormatException ex){
}
}
更改前的公共无效(字符序列、整数开始、整数计数、,
整数后){
//TODO自动生成的方法存根
}
public void onTextChanged(字符序列、int start、int before、int count){
}
}

将edittext中写入的最后一个值保存在字符串中,每次调用onTextChanged时,您都会将新值与旧值进行比较。如果新值不同,则执行某些操作。如果它的值与您不做任何事情的值相同

我猜每次构建新视图时,您都在向
TextView
添加一个新的
TextWatcher
。因此在最后,调用
posterextchanged
方法的次数等于列表中的项数

您应该从代码中的get view方法中删除这一行

那就不是了 为每个视图添加多个textwatcher。。添加上面的行 在适配器构造函数中,它将正常工作

    viewHolder.edQuantity.addTextChangedListener(new 
CartItemQuantityChangeListener(cartItems,item));