Описание:
Я хочу добавлять новый элемент EditText в RecyclerView, когда пользователь что-то ввёл в уже существующем EditText. Но уже со старта приложения создается 4 элемента EditText, после того, как что-то вводишь в один из них, добавляется еще несколько элементов.
Как я это делал:
В onCreate я создаю список из строк и добавляю к нему строку ""(пустую), передаю этот список адаптеру. В адаптере я создал TextWatcher, в afterTextChanged я проверяю, пустой ли последний элемент списка, если нет, то я добавляю ""(пустую строку).
Так выглядит приложение после запуска(сразу появляются 4 editText):
Код активити:
public class AddElement extends AppCompatActivity {
ArrayList<String> subtasks;
SubtasksAdapter adapter;
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_element);
subtasks = new ArrayList<>();
subtasks.add("");
recyclerView = findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
adapter = new SubtasksAdapter(subtasks);
recyclerView.setAdapter(adapter);
}
Код адаптера:
public class SubtasksAdapter extends RecyclerView.Adapter<SubtasksAdapter.SubtasksViewHolder> {
ArrayList<String> elements;
public SubtasksAdapter(ArrayList<String> elements) {
this.elements = elements;
}
@NonNull
@Override
public SubtasksViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Context context = parent.getContext();
int LayoutIdForListItem = R.layout.example_of_item3;
LayoutInflater layoutInflater = LayoutInflater.from(context);
View view = layoutInflater.inflate(LayoutIdForListItem, parent, false);
return new SubtasksViewHolder(view, new CustomEditTextListener());
}
@Override
public void onBindViewHolder(@NonNull SubtasksViewHolder holder, int position) {
holder.bind(position);
}
@Override
public int getItemCount() {
return elements.size();
}
class SubtasksViewHolder extends RecyclerView.ViewHolder {
CheckBox checkBox;
EditText editText;
CustomEditTextListener customEditTextListener;
public SubtasksViewHolder(@NonNull View itemView, CustomEditTextListener customEditTextListener) {
super(itemView);
this.customEditTextListener = customEditTextListener;
checkBox = itemView.findViewById(R.id.checkBox);
editText = itemView.findViewById(R.id.editText);
editText.addTextChangedListener(customEditTextListener);
}
void bind(int position) {
editText.setHint("Добавьте шаг");
customEditTextListener.updatePosition(getAdapterPosition());
editText.setText(elements.get(position));
}
}
class CustomEditTextListener implements TextWatcher {
int position;
public void updatePosition(int position) {
this.position = position;
}
@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) {
elements.set(position, s.toString());
String tempString2 = "";
String tempString1 = elements.get(elements.size() - 1);
if (tempString1 != tempString2) {
elements.add("");
}
}
}