#android #android-recyclerview
#Android #android-recyclerview
Вопрос:
В моем приложении у меня есть RecyclerView с редактируемыми представлениями EditText как часть ViewHolder, см. Рисунок:
Пользователь может редактировать значения представлений 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
вместо этого. Затем перехватите событие после изменения текста или в режиме реального времени, если вы предпочитаете. Таким образом, вы не полагаетесь на событие изменения фокуса для получения текста.