Jump to content

[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 !

Edited by mikael84
Link to comment
Share on other 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
Link to comment
Share on other 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 ?

Edited by mikael84
Link to comment
Share on other 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
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...