@justxz

Как автоматически добавлять EditText в RecyclerView?

Описание:

Я хочу добавлять новый элемент EditText в RecyclerView, когда пользователь что-то ввёл в уже существующем EditText. Но уже со старта приложения создается 4 элемента EditText, после того, как что-то вводишь в один из них, добавляется еще несколько элементов.

Как я это делал:

В onCreate я создаю список из строк и добавляю к нему строку ""(пустую), передаю этот список адаптеру. В адаптере я создал TextWatcher, в afterTextChanged я проверяю, пустой ли последний элемент списка, если нет, то я добавляю ""(пустую строку).

Так выглядит приложение после запуска(сразу появляются 4 editText):
Xgyyh.png

Код активити:
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("");
        }

    }
}
  • Вопрос задан
  • 49 просмотров
Решения вопроса 1
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
В Java некоторые вещи сделаны через ж. Например, строки сравниваются не так:
if (tempString1 != tempString2) {
    elements.add("");
}

а вот так:
if (!tempString1.equals(tempString2)) {
    elements.add("");
}


Переходите лучше на Kotlin.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sandroisu
@sandroisu
Все good
adapter.notifyDataSetChanged(); не поможет?
если вопрос в другом то нужно как то понятнее задачу описать, потому что как я понял из вопроса это все что нужно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
S2 | CRM Тольятти
от 120 000 до 200 000 ₽
Почта Банк Москва
от 207 000 до 240 000 ₽
от 120 000 до 200 000 ₽
02 апр. 2020, в 09:54
1000 руб./за проект
02 апр. 2020, в 09:18
1000 руб./за проект
02 апр. 2020, в 08:52
1200 руб./в час