Note that there are some explanatory texts on larger screens.

plurals
  1. POandroid editText onTextChanged called dozens of times even when no text is changed
    primarykey
    data
    text
    <p>I am implementing a shopping cart in my application. In my cart view I have a list of products with a editText so the user can change their quantities. I need to listen to the "quantity change" event so I can update my Cart object accordingly.</p> <p>I am trying to use onTextChanged event but its not working as expected. Just when I open my cart view the event is fired like dozens of times and breaks completely my product quantity values.</p> <p>How can I make sure the value is really changed?</p> <p>Here is my code:</p> <p><strong>My CartItemsListAdapter (responsible for rendering each row of the cart).</strong></p> <pre><code>public class CartItemsListAdapter extends ArrayAdapter&lt;CartItem&gt; implements OnClickListener{ private ArrayList&lt;CartItem&gt; 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&lt;CartItem&gt; 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 } } </code></pre> <p><strong>My TextChanged listener class</strong></p> <pre><code>public class CartItemQuantityChangeListener implements TextWatcher { private ArrayList&lt;CartItem&gt; cartItems; private CartItem item; public CartItemQuantityChangeListener(ArrayList&lt;CartItem&gt; 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) { } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload