Enregistrement EditText contenu dans RecyclerView
J'ai élément de la liste avec EditText
en elle, je ne sais pas combien d'articles il y en aura.
J'ai un problème quand je tape du texte dans EditText
, puis faites défiler vers le bas d'un RecyclerView
, après que j'ai faites défiler jusqu'à nouveau il n'y a pas de texte dans mon premier EditText
.
Je me demande de quoi, et où dois-je écrire le code de sorte que, si l'utilisateur tape ou terminé (je pensais le faire avec un TextWatcher
) dans le EditText
le texte est enregistré dans un fichier (je vais l'enregistrer dans un .fichier txt dans le stockage externe)
Suis-je censé faire dans le onCreate
méthode de l'activité ou dans la classe d'adaptateur ou d'ailleurs?
Voici un code
L'Activité principale de code
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);
}
Mon code d'adaptateur
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;
}
sans cette "addtextChangedListener" mon code fonctionne très bien obviusly pas enregistrer le contenu de l'édition du Texte lors d'un défilement. Si j'ajoute ce code, quand je défilez toutes les editText points de vue qui sortent de l'écran et de revenir en ont foiré contenu.
- merci de partager votre code pour la carte, mises en page, de l'activité/fragment qui héberge recyclerView.
- Utiliser un TextWatcher pour enregistrer le texte saisi d'une représentation en mémoire de votre liste, puis enregistrez ce à SharedPreferences Activité ou un Fragment de onStop() la méthode.
- vous pouvez en trouver un editText dans votre activité.Vous avez juste à trouver la vue de votre editText de cette position. Si vous souhaitez ce type de code que je peux vous aider.
- publier vos onBindViewHolder
- J'ai ajouté le code
- J'ai ajouté le code
- J'ai ajouté le code
Vous devez vous connecter pour publier un commentaire.
Le problème majeur avec votre solution est l'allocation et l'attribution TextWatcher dans onBindViewHolder qui est une opération coûteuse qui vous fera découvrir les gal au cours rapide des parchemins et il semble également interférer avec la détermination de la position de mise à jour dans mAdapter.
Faire toutes les opérations en onCreateViewHolder est plus l'option préférable. Voici la testé solution de travail:
notifyItemChanged(index);
lorsque nous mettre à jour le contenu de la carte ?position
. Alors, pourquoi nous n'avons besoin d'appelernotifyItemChanged
notifyItemChange
.onTextChanged
être invoquée comme vous recycler?onBindViewHolder
parce que la position d'un objet peut changer sans autreonBindViewHolder
appel. Au lieu de celaMyCustomEditTextListener
doit être une référence à unViewHolder
et appelViewHolder.getAdapterPosition()
pour obtenir la position correcte.J'ai eu le même problème, j'ai ajouté la ligne suivante et il semble avoir résolu le problème de mon côté.
J'espère que ce trie le problème de votre côté.
Je voudrais créer une interface et passer le courant de l'adaptateur de mesure de répondre dans le texte de l'événement de changement de
Créer un tableau de chaînes avec la taille de votre carte de données.
Par exemple:
String[] texts = new String[dataSize];
sur le onBindViewHolder méthode à l'intérieur de votre carte , ajouter un TextChangedListener pour le Textview.
Par exemple : -
Salut @mikwee assurez-vous d'ajouter du texte modifié auditeur ci-dessous la méthode plutôt que de l'ajouter à onBindViewHolder().
J'ai mis en place @dkarmazi solution, mais il ne m'a pas aidé. Donc, j'ai encore à venir et il est vraiment de solution de travail.
Le principal problème était que appliqué TextWatcher continué à travailler pendant élément de recyclage.
J'ai essayé de le désactiver avant de recycler, mais il n'y a aucune "beforeRecycle" méthodes d'événement. J'ai donc utilisé
onViewDetachedFromWindow
méthode, et il a bien fonctionné.Il n'y a qu'un seul problème, après l'ajout de EditText personnalisé Modifiable.L'usine de la liste des freins à nouveau. Je ne sais pas pourquoi, peut-être que je vais trouver la solution à ce problème trop
Remplacer onViewRecycled méthode dans RecyclerView adaptateur comme ceci:
holder.getAdapterPosition()
à l'intérieur de la TextWatcher est la meilleure solution, alors vous n'avez pas besoin de garder une trace de la position, parce que le recycleur est fait pour vous. Assurez-vous simplement qu'un seul TextWatcher est ajouté à la vue des titulaires de constructeur.onViewRecycled()
sera pas être appelé, de sorte que vous ne collecte les modifications. Avec leTextWatcher
vous serez toujours informé des changements.Selon moi, c'est plus optimiser de @dkarmazi la réponse de
Je ne suis pas familier avec RecyclerView objets, mais j'ai eu le même problème avec ListView. Pour ceux-là, j'ai l'habitude de créer un groupe ad-hoc de la classe représentant les valeurs insérées dans mon point de vue (il fonctionne avec EditTexts, Cases à cocher, des RadioButtons...) et d'obtenir des données à jour à travers eux. J'ai ensuite créer un ArrayAdapter comprenant ledit conteneur d'objets, de l'extraction des valeurs à mettre dans la edittexts à chaque getView() de rappel et mise en œuvre d'un textwatcher de garder ces objets jusqu'à ce jour. Encore une fois, je n'ai pas exactement rappelez-vous comment RecyclerViews de travail, mais si elles impliquent des Cartes, cela pourrait être un bon hack pour vous d'essayer.
Pour moi les solutions ci-dessus n'a pas fonctionné. Pour certains d'entre eux, l'auditeur n'a pas d'appeler et quand l'auditeur est appelé dans le onBindViewHolder méthode, il semble même lorsque vous faites défiler l'écouteur d'événements sont appelés. "Texte" qui est en train de changer, Alors j'ai essayé la clé de l'écouteur, et il a bien fonctionné. N'appuyez sur aucune touche pendant le défilement, je suppose.
Le code qui a fonctionné pour moi.
De substituer ci-dessous la méthode pour résoudre le problème: