Aller au contenu

ListView dans un AlertDialog


Gabin

Recommended Posts

Bonjour,

Je me trouve face à un problème mais je n'arrive pas à voir comment le résoudre.

Je souhaite proposer une ListView dans une AlertDialog mais je me retrouve avec un NullPointerException.

Voici le bout de code en question qui se trouve dans mon main :

//Récupération de la listview créée dans le fichier main.xml
       ListView maListViewPerso = (ListView) findViewById(R.id.lv_Reglage);

       //Création de la ArrayList qui nous permettra de remplire la listView
       ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();

       //On déclare la HashMap qui contiendra les informations pour un item
       HashMap<String, String> map;

       //Création d'une HashMap pour insérer les informations du premier item de notre listView
       map = new HashMap<String, String>();
       //on insère un élément titre que l'on récupérera dans le textView titre créé dans le fichier affichageitem.xml
       map.put("titreReg", "Profil");
       //on insère un élément description que l'on récupérera dans le textView description créé dans le fichier affichageitem.xml
       map.put("descriptionReg", "Gérer votre profil");
       //on insère la référence à l'image (convertit en String car normalement c'est un int) que l'on récupérera dans l'imageView créé dans le fichier affichageitem.xml
       map.put("imgReg", String.valueOf(R.drawable.boutonrondprofil));
       //enfin on ajoute cette hashMap dans la arrayList
       listItem.add(map);

       //On refait la manip plusieurs fois avec des données différentes pour former les items de notre ListView

       map = new HashMap<String, String>();
       map.put("titreReg", "Option");
       map.put("descriptionReg", "régler les options");
       map.put("imgReg", String.valueOf(R.drawable.boutonrondreglage));
       listItem.add(map);

       //Création d'un SimpleAdapter qui se chargera de mettre les items présent dans notre list (listItem) dans la vue affichageitem
       SimpleAdapter mSchedule = new SimpleAdapter (this.getBaseContext(), listItem, R.layout.affreglage,
              new String[] {"imgReg", "titreReg", "descriptionReg"}, new int[] {R.id.imgReg, R.id.titreReg, R.id.descriptionReg});

       //On attribut à notre listView l'adapter que l'on vient de créer
       maListViewPerso.setAdapter(mSchedule); /* J'ai le problème lorsque cette ligne est appelée. Si je la squizz avec un double slash je n'ai plus de pb */

Voici le fichier XML de mon AlertDialog :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:padding="15px">

<ScrollView android:layout_width="fill_parent"
	android:layout_height="wrap_content">

	<LinearLayout android:orientation="vertical"
		android:layout_width="fill_parent" android:layout_height="wrap_content">

		<TextView android:id="@+id/adReglage_titre"
			android:layout_width="wrap_content" android:layout_height="wrap_content"
			android:paddingBottom="10dip" android:text="@string/st_adReglage_titre"
			android:textColor="#fff" android:textSize="30sp" android:textStyle="bold" />

		<ListView android:id="@+id/lv_Reglage"
			android:layout_width="fill_parent" android:layout_height="fill_parent" />

	</LinearLayout>
</ScrollView>

</RelativeLayout>

Merci à vous :)

Lien vers le commentaire
Partager sur d’autres sites

Pour l'erreur en effet je l'ai indiquée mais il y a tellement de commentaires dans mon code ^^

Du coups l'erreur se situe lorsque j'appelle la dernière ligne du bout de code de mon main.

Et pour le coup de la ScrollView en effet je n'avais pas fais gaffe. En fait j'ai fais un bête copier/coller d'un autre XML d'une autre de mes alertDialog.

Je vais rectifier tout ça !

Merci pour ton aide.

Lien vers le commentaire
Partager sur d’autres sites

2 petites interrogations:

- tu parles d'un AlertDialog.xml, mais dans ton code, tu indiques aller chercher la ListView dans le main.xml. Parles-tu de la même chose ?

- tu construits une Map avec des valeurs associées aux clés "titre", "descritpion" et "img", et quand tu construits le SimpleAdapter, tu indiques les valeurs "titreReg", "descriptionReg" et "imgReg". Les noms devraient être les mêmes des 2 cotés

Si cela ne résout pas le problème, peux-tu mettre la stacktrace de ton exception ?

Lien vers le commentaire
Partager sur d’autres sites

Alors oui en effet j'avais oublié de corriger mais les valeurs sont bien titreReg, descriptionReg et imgReg.

Sinon pour la récupération de ma ListView, elle est en effet dans le fichier alertreglage.xml.

Je pensais qu'en appelant l'id de ma ListView (même si mon activité est définie avec mon mail.xml), cela ne poserait pas de problèmes...

Comment devrais-je m'y prendre du coups pour arriver à récupérer ma ListView ?

Sinon voici mon erreur :

02-28 11:50:FATAL EXCEPTION: main
02-28 11:50:49.054: ERROR/AndroidRuntime(18091): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.mecadev.empdtps.univorleans/net.mecadev.empdtps.univorleans.Main}: java.lang.NullPointerException
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at android.os.Looper.loop(Looper.java:123)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at android.app.ActivityThread.main(ActivityThread.java:4627)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at java.lang.reflect.Method.invokeNative(Native Method)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at java.lang.reflect.Method.invoke(Method.java:521)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at dalvik.system.NativeStart.main(Native Method)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091): Caused by: java.lang.NullPointerException
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at net.mecadev.empdtps.univorleans.Main.onCreate(Main.java:393)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
02-28 11:50:49.054: ERROR/AndroidRuntime(18091):     ... 11 more

Merci

Lien vers le commentaire
Partager sur d’autres sites

Comment devrais-je m'y prendre du coups pour arriver à récupérer ma ListView ?

En implémentant ce code non pas dans le onCreate de ton Activity, mais dans le onCreate de ton AlertDialog

Lien vers le commentaire
Partager sur d’autres sites

Je devrais donc faire comme cela :

onCreateDialog (dans mon mail.xml) :

protected Dialog onCreateDialog(int id) {
	Dialog dlg;
	switch (id) {

	case dial_Reglage:
	{

		AlertDialog.Builder alertReglageBuilder = new AlertDialog.Builder(this);
		LayoutInflater factory2 = LayoutInflater.from(this);

		final View alertReglageView = factory2.inflate(R.layout.alertreglage, null);
		alertReglageBuilder.setView(alertReglageView);

		ListView maListViewPerso = (ListView) findViewById(R.id.lv_Reglage);

		ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();

		HashMap<String, String> map;

		map = new HashMap<String, String>();

		map.put("titreReg", "Profil");
		map.put("descriptionReg", "Gérer votre profil");
		map.put("imgReg", String.valueOf(R.drawable.boutonrondprofil));
		listItem.add(map);

		map = new HashMap<String, String>();
		map.put("titreReg", "Option");
		map.put("descriptionReg", "régler les options");
		map.put("imgReg", String.valueOf(R.drawable.boutonrondreglage));
		listItem.add(map);

		SimpleAdapter mSchedule = new SimpleAdapter (this.getBaseContext(), listItem, R.layout.affreglage,
              new String[] {"imgReg", "titreReg", "descriptionReg"}, new int[] {R.id.imgReg, R.id.titreReg, R.id.descriptionReg});

		maListViewPerso.setAdapter(mSchedule);

		dlg = alertReglageBuilder.create();
		break;

	}

	default:
		dlg = null;
	}
	return dlg;
}

Je me retrouve avec ça lorsque je clic sur le bouton qui doit afficher mon alertDialog :

02-28 12:26:01.929: ERROR/AndroidRuntime(18573): FATAL EXCEPTION: main
02-28 12:26:01.929: ERROR/AndroidRuntime(18573): java.lang.NullPointerException
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at net.mecadev.empdtps.univorleans.Main.onCreateDialog(Main.java:482)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at android.app.Activity.onCreateDialog(Activity.java:2472)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at android.app.Activity.createDialog(Activity.java:881)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at android.app.Activity.showDialog(Activity.java:2547)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at android.app.Activity.showDialog(Activity.java:2514)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at net.mecadev.empdtps.univorleans.Main$3.onClick(Main.java:321)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at android.view.View.performClick(View.java:2461)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at android.view.View$PerformClick.run(View.java:8890)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at android.os.Handler.handleCallback(Handler.java:587)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at android.os.Looper.loop(Looper.java:123)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at android.app.ActivityThread.main(ActivityThread.java:4627)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at java.lang.reflect.Method.invokeNative(Native Method)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at java.lang.reflect.Method.invoke(Method.java:521)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
02-28 12:26:01.929: ERROR/AndroidRuntime(18573):     at dalvik.system.NativeStart.main(Native Method)

Qu'est ce que je n'ai pas pigé ?

Lien vers le commentaire
Partager sur d’autres sites

Remplace la ligne

ListView maListViewPerso = (ListView) findViewById(R.id.lv_Reglage);

par

ListView maListViewPerso = (ListView) alertReglageView.findViewById(R.id.lv_Reglage);

(Il faut que tu ailles chercher la ListView sur la View de ton AlertDialog, pas sur celle de ton Activity)

Lien vers le commentaire
Partager sur d’autres sites

Un petit up ! Quelqu'un aurait il une idée ?

Ma ListView ne charge que mon premier item... pourquoi ?

Je remet le code ici :

AlertDialog.Builder alertReglageBuilder = new AlertDialog.Builder(this);
		LayoutInflater factory2 = LayoutInflater.from(this);

		final View alertReglageView = factory2.inflate(R.layout.alertreglage, null);
		alertReglageBuilder.setView(alertReglageView);

        maListViewPerso = (ListView) alertReglageView.findViewById(R.id.lv_Reglage);

        ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();

		HashMap<String, String> map;

		map = new HashMap<String, String>();
		map.put("titreReg", "Profil");
		map.put("descriptionReg", "Gérer votre profil");
		map.put("imgReg", String.valueOf(R.drawable.boutonrondprofil));
		listItem.add(map);

		map = new HashMap<String, String>();
		map.put("titreReg", "Option");
		map.put("descriptionReg", "régler les options");
		map.put("imgReg", String.valueOf(R.drawable.boutonrondreglage));
		listItem.add(map);

		SimpleAdapter mSchedule = new SimpleAdapter (this.getBaseContext(), listItem, R.layout.affreglage,
              new String[] {"imgReg", "titreReg", "descriptionReg"}, new int[] {R.id.imgReg, R.id.titreReg, R.id.descriptionReg});

		maListViewPerso.setAdapter(mSchedule);

Merci à vous :)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...