Aller au contenu

[Résolu][Question] Comment conserver l'état d'un objet quand les données changes dans un adapter ?


Recommended Posts

Bonjour à tous,

Tout d'abords, merci à ceux qui se donnent la peine de lire ce sujet.

J'ai donc un problème qui n'est pas un bug, mais plutôt une façon de procéder.

J'ai une activité qui liste des produits, (comme une sorte de boutique), dans une liste et dont on peut choisir les éléments à commander et leurs quantités.

J'ai donc une activité qui contient un EditText qui possède un TextWatcher, et une ListView avec un Adapter personnalisé qui hérite de BaseAdapter.

Donc à chaque lettre saisie dans l'EditText, les données contenues dans mon Adapter changent.

On peut sélectionner un ou plusieurs éléments dans la liste et chaque ligne de la liste contient des boutons (Incrémentation et décrémentation) d'un élément de la ligne (quantité = 0, 1, 2, 3, ...).

L’évènement qui modifie la quantité d'une ligne se situe dans l'Adapter, alors que le choix (sélection d'un

élément de la liste) se situe dans l'activité (avec OnItemClickListener).

Et je voudrais qu'à chaque rechargement de données (qui sont alors nouvelle), les éléments précédemment sélectionnés et les quantités précédemment choisies, restent sélectionnés et les quantités choisies restent aux mêmes valeurs.

Comment dois-je procéder ? Faut-il une liste qui contient les données sélectionnées avec leurs quantités, et je met à jour la nouvelle liste ?

Ou y-a-t-il une solution plus simple ?

Voila, j'espère avoir été clair et je vous remercie d'avance de votre aide !

Ps: Voici quelques extraits de code :

Le layout de l'activité :

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="[url="http://schemas.android.com/apk/res/android"]http://schemas.andro...pk/res/android"[/url]

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

<EditText

	android:id="@+building_list/search_box"

	android:layout_width="wrap_content"

	android:layout_height="wrap_content"

	android:hint="Filtrer par référence ou par libellé"

	android:inputType="textAutoCorrect|none|textAutoComplete|none|textNoSuggestions"

	android:maxLines="1"

	android:textSize="20dp" />

<ListView

	android:layout_width="fill_parent"

	android:layout_height="fill_parent"

	android:layout_marginLeft="10dp"

	android:id="@+id/laListeProduit">

</ListView>

</LinearLayout>

Une partie de l'Adapter :

public class AdapterProduit extends BaseAdapter {	
private List<Produit> lstProduit;
private LayoutInflater mInflater;

public AdapterProduit(Context context, List<Produit> listP) {
	lstProduit = listP;
	mInflater = LayoutInflater.from(context);
	}

public View getView(int position, View convertView, ViewGroup parent) {
	CheckedLinearLayout layoutItem;

	if (convertView == null) {		
		layoutItem = (CheckedLinearLayout) mInflater.inflate(R.layout.row_produit, parent, false);
		final ViewHolderProduit viewHolder;
		viewHolder = new ViewHolderProduit();

		viewHolder.btIncrementQuantite = (Button)layoutItem.findViewById(R.id.btIncrementQuantite);
		viewHolder.btIncrementQuantite.setonclickListener(new onclickListener() {
			@Override
			public void onclick(View v) {
				Produit p = (Produit) viewHolder.produit.getTag();
				p.setQuantite(p.getQuantite()+1);
				notifyDataSetChanged();
			}
		});
	}
	else {
		layoutItem = (CheckedLinearLayout) convertView;
		((ViewHolderQuantiteProduit) layoutItem.getTag()).btIncrementQuantite.setTag(lstProduit.get(position));
	}

	ViewHolderProduit viewHolder = (ViewHolderProduit) layoutItem.getTag();
	viewHolder.quantite.setText(String.valueOf(lstProduit.get(position).getQuantite()));
}

static class ViewHolderProduit {
protected TextView quantite;
protected Button btIncrementQuantite;
}
}

Une partie du code du TextWatcher et du AsyncTask qui modifie les données de ma liste :

AsyncTask
doInBackground =>
modelProduit = new AdapterProduit(leContext,
					ProduitJSON.getService().rechercheProduits(leContext, url, params[0])); //params[0] = texte saisi dans l'EditText


private TextWatcher filterTextWatcher = new TextWatcher() {

public void afterTextChanged(Editable s) {

}

public void beforeTextChanged(CharSequence s, int start, int count,
		int after) {
}

public void onTextChanged(CharSequence s, int start, int before,
		int count) {

	//AsyncTask task
	task.execute(s.toString());
}
};

Encore Merci !

Modifié par mikael84
Lien vers le commentaire
Partager sur d’autres sites

Quand tu crées ton nouvel Adapter contenant les nouvelles données (dans l'AsyncTask), tu pourrais à ce moment là consolider avec les données précédentes (il faut donc que tu en gardes une trace) pour initialiser tes produits avec ce qui a été éventuellement saisi.

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Bonjour et merci de ta réponse,

Désolé de répondre seulement maintenant mais j'étais occupé à faire autre chose.

C'est ce que j'avais déjà tenté de faire, mais je pensais qu'il y aurait une solution plus "propre" de faire cela.

Je suis actuellement sur la bonne voie, je fais des tests et je reviendrais ici pour mettre le sujet comme résolu, ou pour poser une autre question.

Par contre il y a de forte chance que je repasse plutôt lundi.

Merci !

Edit: Ok j'ai réussi !

J'ai donc une liste accessible dans depuis mon activité (en static) qui contient tout les objets sélectionnées.

A chaque arrivé de nouvelle données, je parcours cette liste et celle de mon adapter, et je met à jour. Ensuite à chaque modification d'une ligne (quantité, etc.), j'ai surchargé la méthode "notifyDataSetChanged" et je met à jour ma liste d'objets sélectionnées grâce à un iterateur.

Problème réglé ! Encore merci

Par contre, comment je clos le sujet svp ?

Modifié par mikael84
Lien vers le commentaire
Partager sur d’autres sites

L'utilisation d'attributs statiques dans les Activities est à proscrire (notamment parce que le cycle de vie de l'Activity (instanciation/...) est géré par Android). Dans ton cas, un attribut d'instance doit tout aussi bien fonctionner

Pour clore le sujet, il te suffit de modifier le titre de ton premier post

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...