1

我有一个带有 2 个按钮、1 个文本视图和一个编辑文本的列表视图,文本视图显示产品名称,两个按钮(-&+)增加或减少我的编辑文本中的数量。

最后 3 行(共 4 行)一切正常,它显示了我列表中的位置、产品名称、数量、价格以及我需要的一切。但是,只要我从第一行按下任何按钮,它就会进行 9 圈循环。我的 Toast 会在每个 toast 上显示一个新位置,其中包含适当的信息,除了第一行的数量。

这是扩展 BaseAdapter 的自定义适配器的 getView:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null){
        convertView = inflater.inflate(R.layout.one_product, null);
    }

    final int pos = position;
    Button btnProdChoiMinus = (Button)convertView.findViewById(R.id.btnProdChoiMinus);
    TextView tvProduit = (TextView)convertView.findViewById(R.id.tvProduct);
    Button btnProdChoiPlus = (Button)convertView.findViewById(R.id.btnProdChoiPlus);
    final EditText etQuantity = (EditText)convertView.findViewById(R.id.etQuantite);

    final Produit p= data.get(position);

    btnProdChoiMinus.setText(convertView.getResources().getString(R.string.lblMinus));
    tvProduit.setText(p.getNom());
    btnProdChoiPlus.setText(convertView.getResources().getString(R.string.lblPlus));

以同样的方法,我有我的 2 个按钮侦听器:

btnProdChoiMinus.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (etQuantity.getText().toString().length() != 0){
                quantite = Integer.parseInt(etQuantity.getText().toString()) - 1;
                if (quantite > 0){
                    etQuantity.setText("" + quantite);
                }else{
                    etQuantity.setText("");
                }

            }else{
                Toast.makeText(context, R.string.lblErrQuantity_fr, Toast.LENGTH_SHORT).show();
            }
        }
    });

    btnProdChoiPlus.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (etQuantity.getText().toString().length() != 0){
                quantite = Integer.parseInt(etQuantity.getText().toString()) + 1;
                etQuantity.setText("" + quantite);

            }else{
                etQuantity.setText("1");
            }
        }
    });

最后仍然使用相同的方法,我的 textchanged lister 导致了这个问题:

etQuantity.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {

                if (etQuantity.getText().toString().length() != 0){

                    quantite = Integer.parseInt(etQuantity.getText().toString());

                    Toast.makeText(context, "Position: " + pos + " Produit: " + p.getNom() + " id: " + p.getId() + " Prix: " + p.getPrix() + " Quantité: " + quantite, Toast.LENGTH_SHORT).show();
                    //((NewOrderActivity)activity).updateOrderedProducts(p.getId(), p.getNom(), p.getPrix(), quantite);
                }
            }
        });


        return convertView;
    }

我已经尝试从 afterTextChanged 切换到 onTextChanged 但没有帮助。

非常感激你的帮助 ;)

问候,

塞布

4

1 回答 1

0

发生这种情况是因为etQuantity.addTextChangedListener每次都会向您的etQuantity小部件添加另一个侦听器。

因此,当ListView中的 View 被重用时,您只需向etQuantity添加另一个侦听器(而不是替换旧的侦听器),所有这些侦听器都会触发。尝试使用例如etQuantity.setOnFocusChangeListener并在etQuantity失去焦点时更新数量(你也应该添加((NewOrderActivity)activity).updateOrderedProducts(p.getId(), p.getNom(), p.getPrix(), quantite);到按钮的onClick侦听器)而不是etQuantity.addTextChangedListener

或者,您可以将侦听器保存在 holder 中,并在创建 holder 时仅调用一次etQuantity.addTextChangedListener

于 2014-01-09T13:49:52.867 回答