Android ListView с значениями EditText, дублирующимися с TextWatcher - PullRequest
0 голосов
/ 19 октября 2018

У меня есть ViewHolder:

import android.widget.EditText;
import android.widget.TextView;

public class ListViewHolder {
    TextView productName;
    EditText productStock;
}

И мой ListAdapter (listProducts - это массив объектов Product):

public Product getItem(int position){
    return listProducts.get(position);
}


public View getView(final int position, View convertView, ViewGroup parent){
    View row;
    final ListViewHolder listViewHolder;

    if(convertView == null){
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = layoutInflater.inflate(R.layout.set_stock_listview,parent,false);
        listViewHolder = new ListViewHolder();
        listViewHolder.productName = (TextView) row.findViewById(R.id.productName);
        listViewHolder.productStock = (EditText) row.findViewById(R.id.productStock);
        row.setTag(listViewHolder);
    }
    else{
        row = convertView;
        listViewHolder = (ListViewHolder) row.getTag();
    }

    final Product product = getItem(position);

    if(product.getDesiredQuantity()>0){
        listViewHolder.productStock.setText(String.valueOf(product.getDesiredQuantity()));
    }

    listViewHolder.productName.setText(product.getName()+":");
    listViewHolder.productStock.setInputType(InputType.TYPE_CLASS_NUMBER);
    listViewHolder.productStock.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void afterTextChanged(Editable editable) {
            product.setDesiredQuantity(Integer.valueOf(editable.toString()));
        }
    });
    return row;
}

Однако при прокрутке списка значениеEditText дублирует многие другие строки.Похоже, что он также обновляет другие объекты Product, но я не смог найти проблему, есть идеи?

1 Ответ

0 голосов
/ 19 октября 2018

Проблема заключается в комбинации того факта, что представления могут быть повторно использованы (с помощью аргумента convertView), и того факта, что TextView позволяет только добавить a TextWatcher.В коде, который вы разместили, каждый раз, когда getView() вызывается с ненулевым convertView, вы создаете дополнительный TextWatcher и присваиваете ему productStock ... ипредыдущие наблюдатели останутся на месте, обновляя ранее привязанную product.

. Вы должны удалить существующую TextWatcher, если она есть.Я рекомендую использовать ListViewHolder для этого.

public class ListViewHolder {
    TextView productName;
    EditText productStock;
    TextWatcher productStockWatcher;
}

И затем изменить это:

listViewHolder.productStock.addTextChangedListener(new TextWatcher() { ... });

На это:

if (listViewHolder.productStockWatcher != null) {
    listViewHolder.productStock.removeTextChangedListener(productStockWatcher);
}

listViewHolder.productStockWatcher = new TextWatcher() { ... };
listViewHolder.productStock.addTextChangedListener(listViewHolder.productStockWatcher);
...