У меня есть просмотр списка, который содержит 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
имеет все идентификаторы и значение, введенное в первый текст редактирования для всех. Обратите внимание, что это происходит без прокрутки. Любая помощь приветствуется. Благодарю.
Перед добавлением 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());
}
}
Используйте этот пользовательский класс
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);
}