Редактирование текстового средства просмотра текста для всех редактируемых текстов в просмотре списка

1

У меня есть просмотр списка, который содержит editext для каждой позиции. Я назначил текстовый наблюдатель для каждого текста редактирования, как показано ниже:

holder.prodQuantity.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

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

    @Override
    public void afterTextChanged(Editable s) {
        if(isDialog) {
            recallMap.put(productId, s.toString());
        }
    }

Проблема здесь в том, что всякий раз, когда я добавляю значение к первому тексту редактирования, средство просмотра текста запускается для всех элементов списка. recallMap должен содержать только идентификатор выбранной строки и значение, введенное в тексте редактирования этой строки, но в этом случае recalMap имеет все идентификаторы и значение, введенное в первый текст редактирования для всех. Обратите внимание, что это происходит без прокрутки. Любая помощь приветствуется. Благодарю.

Теги:
android-edittext
hashmap
android-textwatcher
android-listview

2 ответа

1

Перед добавлением textChangedListner в адаптер сначала удалите уже добавленный textChangedListener в этот EditText. подобно

 holder.prodQuantity.removeTextChangedListener(textWatcher);
 // obviously you also need to maintain TextWatchers ArrayList associated with each EditText.
// Or instead of maintaining a separate ArrayList for TextWatcher, you can implement in your Data Model Class.

Тогда ваш код ниже

  holder.prodQuantity.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

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

@Override
public void afterTextChanged(Editable s) {
    if(isDialog) {
        recallMap.put(productId, s.toString());
    }
}
0

Используйте этот пользовательский класс

public class MyCustomEditTextListener implements TextWatcher {
        private int position;

        public void updatePosition(int position) {
            this.position = position;
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
        }

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

        @Override
        public void afterTextChanged(Editable editable) {
           //your edittext text is here
        }
    }

 @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout, parent, false);
        return new ViewHolder(v, new MyCustomEditTextListener(), this);
    }

назначить слушателя для редактирования текста

edittext.addTextChangedListener(myCustomEditTextListener);

обновить позицию списка

@Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.myCustomEditTextListener.updatePosition(position);
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню