Как сохранить содержимое EditText в RecyclerView - PullRequest
0 голосов
/ 06 марта 2019

У меня есть listItem с textView и EditText, это похоже на расписание (textView шо час и EditText для пользователя, чтобы написать заметку), поэтому это будет 24 элемента.

При использовании recyclerView он обновляется, когда я прокручиваю и удаляю написанный мной текст, я пытался реализовать TextWatcher на адаптере, но я не знаю, как его использовать.

Я уже искал, как сохранить текстовое содержимое, но все, что я нашел, это люди, использующие массив для хранения значений, я использую List.

Активность

public class CreateNoteActivity extends AppCompatActivity {

   private String[] eventos;
   private RecyclerView recyclerView;
   TextView data;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_create_note);

       recyclerView = findViewById(R.id.recycler_view);
       LinearLayoutManager layoutManager = new LinearLayoutManager(this);
       layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
       recyclerView.setLayoutManager(layoutManager);


       List<Evento> eventos = new ArrayList<>();
       carregarlistaDoDia(eventos);

       Adapter adapter = new Adapter(eventos);
       recyclerView.setAdapter(adapter);
       adapter.notifyDataSetChanged();
   }

   void carregarlistaDoDia(List<Evento>eventos){
       eventos.add(new Evento("00:00",""));
       eventos.add(new Evento("01:00",""));
       eventos.add(new Evento("02:00",""));
       eventos.add(new Evento("03:00",""));
       eventos.add(new Evento("04:00",""));
       eventos.add(new Evento("05:00",""));
       eventos.add(new Evento("06:00",""));
       eventos.add(new Evento("07:00",""));
       eventos.add(new Evento("08:00",""));
       eventos.add(new Evento("09:00",""));
       eventos.add(new Evento("10:00",""));
       eventos.add(new Evento("11:00",""));
       eventos.add(new Evento("12:00",""));
       eventos.add(new Evento("13:00",""));
       eventos.add(new Evento("14:00",""));
       eventos.add(new Evento("15:00",""));
       eventos.add(new Evento("16:00",""));
       eventos.add(new Evento("17:00",""));
       eventos.add(new Evento("18:00",""));
       eventos.add(new Evento("19:00",""));
       eventos.add(new Evento("20:00",""));
       eventos.add(new Evento("21:00",""));
       eventos.add(new Evento("22:00",""));
       eventos.add(new Evento("23:00",""));
   }

Класс Evento

public class Evento {

private String hora;
private String evento;

public Evento(String hora, String evento) {
    this.hora = hora;
    this.evento = evento;
}




public String getHora() {
    return hora;
}

public void setHora(String hora) {
    this.hora = hora;
}

public String getEvento() {
    return evento;
}

public void setEvento(String evento) {
    this.evento = evento;
}

Адаптер

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> implements TextWatcher{


private List<Evento> eventos;

public Adapter(List<Evento> eventos) {
    this.eventos = eventos;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_listitem,viewGroup,false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
    String hora = eventos.get(i).getHora();
    String evento = eventos.get(i).getEvento();
    viewHolder.setData(hora, evento);

}

@Override
public int getItemCount() {
    return eventos.size();
}

@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) {

}

public static class ViewHolder extends RecyclerView.ViewHolder {

    private TextView hora;
    private EditText evento;

    public ViewHolder(View itemView) {
        super(itemView);
        hora = this.itemView.findViewById(R.id.hora);
        evento = this.itemView.findViewById(R.id.txt_evento);
    }

    private void setData(String txtHora, String txtEvento){
        hora.setText(txtHora);
        evento.setText(txtEvento);
    }
}

1 Ответ

0 голосов
/ 06 марта 2019

Попытайтесь удалить TextWatcher за пределами ViewHolder, это очень плохой выбор, поставить его туда.

Создайте для этого класс, например:

private class EditTextTextWatcher implements TextWatcher {
        private int posicion;
        private List<Eventos> listaEventos;

        public void updatePosicionYTexto(int posicion, List<Eventos> listaEventos) {
            this.listaEventos = listaEventos;
            this.posicion = posicion;
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            listaEventos.get(posicion).setEvento(charSequence.toString());
        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    } 

Затем, когда вы хотите написать заметку, вы делаете:

viewHolder.editTextTextWatcher.updatePosicionYTexto(viewHolder.getAdapterPosition(),listaEventos);

Внутри вашего ViewHolder вы создаете эти два метода, вы должны отправить new EditTextTextWatcher() в качестве параметра вашему ViewHolder и создать экземпляр EditTextTextWatcher внутри, например:

public EditTextTextWatcher editTextTextWatcher;

А затем добавьте эти методы:

void enableTextWatcher() {
        evento.addTextChangedListener(EditTextTextWatcher);
    }

    void disableTextWatcher() {
        evento.removeTextChangedListener(EditTextTextWatcher);
    }

И не забудьте добавить эти методы в ваш ViewHolder

@Override
public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) {
    ((ViewHolder) holder).enableTextWatcher();
}

@Override
public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) {
    ((ViewHolder) holder).disableTextWatcher();
}

Надеюсь, это ясно

...