繁体   English   中英

即使没有更改文本,android editText onTextChanged也会调用几十次

[英]android editText onTextChanged called dozens of times even when no text is changed

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

我试图使用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) {

    }

}

将编辑文本中写入的最后一个值保存在String中,每次调用onTextChanged时,将新值与旧值进行比较。 如果新值不同,那就做点什么吧。 如果它的价值相同,你什么都不做

您应该从代码中的get view方法中删除此行。

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

然后它没有为每个视图添加多个textwatcher ..在适配器构造函数中添加上面的行然后它将正常工作..

我想每次构建一个新视图时, TextWatcherTextView添加一个新的TextWatcher 因此,最后, afterTextChanged方法的调用次数等于列表中的项目数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM