Ich habe einen Listeneintrag EditText
darin, ich weiß nicht, wie viele Einträge es geben wird. Ich habe ein Problem, wenn ich Text EditText
eingebe und dann nach unten scrolle RecyclerView
. Nachdem ich wieder nach oben gescrollt habe, befindet sich in meinem ersten Text kein Text EditText
.
Ich frage mich , was und wo soll ich Code schreiben , so dass während der Benutzer die Eingabe oder Eingabe beendet ist (ich dachte , das zu tun, mit ein TextWatcher
) in EditText
den Text in einer Datei gespeichert wird (ich es in eine sparen werde. txt-Datei im externen Speicher)
Soll ich das in der onCreate
Methode der Aktivität oder in der Adapterklasse oder anderswo tun ?
Hier ist ein Code
Hauptaktivitätscode
public class MainActivity extends Activity {
RecyclerView mRecyclerView;
MyAdapter mAdapter;
String[] mDataSet= new String[20];
@Override
protected void onCreate(Bundle savedInstanceState) {
// generating text for editText Views
for (int i = 0; i<=19; i++){
mDataSet[i]= "EditText n: "+i;
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mAdapter = new MyAdapter(mDataSet);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setHasFixedSize(true);
}
Mein Adaptercode
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public EditText mEditText;
public ViewHolder(View v) {
super(v);
mEditText = (EditText) v.findViewById(R.id.list_item_edittext);
}
}
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.mEditText.setText(mDataset[position]);
//without this addtextChangedListener my code works fine ovbiusly
// not saving the content of the edit Text when scrolled
// If i add this code then when i scroll all textView that go of screen
// and than come back in have messed up content
holder.mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
//setting data to array, when changed
// this is a semplified example in the actual app i save the text
// in a .txt in the external storage
mDataset[position] = s.toString();
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
@Override
public int getItemCount() {
return mDataset.length;
}
Ohne diesen "addtextChangedListener" funktioniert mein Code offensichtlich einwandfrei, ohne den Inhalt des Bearbeitungstextes beim Scrollen zu speichern. Wenn ich diesen Code hinzufüge, haben beim Scrollen alle editText-Ansichten, die vom Bildschirm verschwinden und dann wieder eingehen, den Inhalt durcheinander gebracht.