Не удается получить значение EditText в ViewHolder RecyclerView

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

В моем приложении у меня есть RecyclerView с редактируемыми представлениями EditText как часть ViewHolder, см. Рисунок:

RecyclerView с ViewHolders и представлениями EditText

Пользователь может редактировать значения представлений EditText. Чтобы сохранить измененное значение обратно в соответствующий адаптер, установите OnFocusChangeListener для представлений EditText, сохраняя (измененное) значение, как только они теряют фокус, см. Следующий фрагмент кода, взятый из метода onBindViewHolder моего адаптера:

 // Add listener to views
        holder.fpuView.setOnFocusChangeListener((v, hasFocus) -> {
            if (!hasFocus) {
                // Focus has gone, so save value to adapter
                mAbsorptionBlocks.get(position).setMaxFPU(Integer.valueOf(holder.fpuView.getText().toString()));
            }
        });
        holder.absorptionTimeView.setOnFocusChangeListener((v, hasFocus) -> {
            if (!hasFocus) {
                // Focus has gone, so save value to adapter
                mAbsorptionBlocks.get(position).setAbsorptionTime(Integer.valueOf(holder.absorptionTimeView.getText().toString()));
            }
        });
  

Это работает нормально, пока пользователь нажимает на другое представление EditText.

Это не сработает, если пользователь напрямую нажмет кнопку «Сохранить» сразу после изменения значения EditText. EditText, похоже, не распознает, что потерял фокус. Вероятно, это связано с тем, что кнопка Сохранения принадлежит не RecyclerView, а родительскому действию.

Я поиграл с другими вариантами прослушивания, но теперь я довольно потерян. Есть ли какой-либо шанс получить измененные значения, когда пользователь нажимает кнопку Сохранения непосредственно после редактирования значения?

Ответ №1:

Вы должны использовать этот метод EditText

 holder.fpuView.addTextChangedListener(new 
TextWatcher() {

 @Override
  public void afterTextChanged(Editable s) {}

  @Override    
  public void beforeTextChanged(CharSequence s, int 
  start,int count, int after) {
  }

  @Override    
  public void onTextChanged(CharSequence s, int start,
  int before, int count) {
     if(s.length() != 0) {  
        mAbsorptionBlocks.get(position). setMaxFPU(Integer.valueOf(holder.fpuView.getText().toString()));
     }else{
            // add default value when EditText is empty. 
      }     
  

}
});

Комментарии:

1. Спасибо, Бхавеш, это решение моей проблемы 🙂

Ответ №2:

Используйте OnTestChangeListener вместо этого. Затем перехватите событие после изменения текста или в режиме реального времени, если вы предпочитаете. Таким образом, вы не полагаетесь на событие изменения фокуса для получения текста.