Aller au contenu

[Résolu] Persistence d'un Arraylist via putParcelableArrayList


CyrilleH

Recommended Posts

Bonjour,

Tout d'abord je ne sais pas si il existe un endroit où se présenter, je n'hésiterai pas à y indiquer mon profil.

Pour faire simple, je suis actuellement en train de travailler sur une application dont une partie doit permettre de gérer des périphériques bluetooth.
Je stocke donc les périphériques bluetooth découverts par mon BluetoothAdapter dans une ArrayList<BluetoothDevice>.

Lorsque je souhaite sauvegarder cette liste depuis la fonction onSaveInstanceState de mon activité puis la récupérer dans la fonction onRestoreInstanceState,
cette liste me revient vide.

Mon code est le suivant, sachant que la classe BluetoothDevice implémente Parcelable et que pour un objet simple mon code fonctionne correctement.

private ArrayList<BluetoothDevice> listBluetooth = new ArrayList<BluetoothDevice>();
 	private BluetoothDevice mCurrentDevice;
 
        @[member="override"]
 	protected void onSaveInstanceState (Bundle bundle)
 	{
		 super.onSaveInstanceState(bundle);
		 bundle.putParcelable("currentDevice", mCurrentDevice);
                 //ici listBluetooth.size() > 0
		 bundle.putParcelableArrayList("bluetoothList", listBluetooth);
	 }
 
	 @[member="override"]
	 public void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
                //ici je récupère la bonne valeur de mCurrentDevice
		mCurrentDevice = savedInstanceState.getParcelable("currentDevice");
		if (mCurrentDevice != null)
		{
			tvCurrentDevice.setBluetoothName(mCurrentDevice.getName());
			tvCurrentDevice.setBluetoothMacAddress(mCurrentDevice.getAddress());
		}
 
                //Ici ma liste est vide
		listBluetooth = savedInstanceState.getParcelableArrayList("bluetoothList");
                //Probleme listBluetooth.size() == 0
		for (int i = 0 ; i< listBluetooth.size() ; i++)
		{
			BluetoothNetwork btNetwork = new BluetoothNetwork();
			btNetwork.setBluetoothNetwork(listBluetooth.get(i));
			bluetoothArrayAdapter.add(btNetwork);
		}
	}

J’espère que l'un d'entre vous pourra m'éclairer sur ce petit soucis ou me donner une piste de recherche à approfondir.
Merci d'avance pour votre aide.

Cyrille

Lien vers le commentaire
Partager sur d’autres sites

J'ai résolu le mystère,

Ma variable ArrayList<BluetoothDevice> listBluetooth est une variable membre, et je pense qu'il y a un probleme de réallocation lors du passage
de OnSaveInstanceState à OnRestaureInstanceState.

J'ai nettoyé mon code, et ma liste de BluetoothDevice est contenue dans un ArrayAdapter que j'utilise pour l'affichage.

je me passe donc de ArrayList<BluetoothDevice> listBluetooth, par contre je créé une variable locale de type
ArrayList<BluetoothDevice> à passer à mon bundle et une autre dans la fonction de restauration dans laquelle je récupère mes données.

 

Le code que j'ai maintenant et qui fonctionne est le suivant:

	private BluetoothArrayAdapter bluetoothArrayAdapter;
	private BluetoothDevice mCurrentDevice;

        @[member=override]
	protected void onSaveInstanceState (Bundle bundle)
	{
		super.onSaveInstanceState(bundle);
		ArrayList<BluetoothDevice> bluetoothList = new ArrayList<BluetoothDevice>();
		bundle.putParcelable("utt.developpement.bluetooth.currentDevice", mCurrentDevice);
		for (int i = 0 ; i < bluetoothArrayAdapter.getCount() ; i++ )
			bluetoothList.add(bluetoothArrayAdapter.getItem(i));
		bundle.putParcelableArrayList("bluetoothList", bluetoothList);
	}

	@[member=override]
	public void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		ArrayList<BluetoothDevice> bluetoothList = new ArrayList<BluetoothDevice>();
		mCurrentDevice = savedInstanceState.getParcelable("utt.developpement.bluetooth.currentDevice");
		if (mCurrentDevice != null)
		{
			tvCurrentDevice.setBluetoothName(mCurrentDevice.getName());
			tvCurrentDevice.setBluetoothMacAddress(mCurrentDevice.getAddress());
		}
		
		bluetoothList = savedInstanceState.getParcelableArrayList("bluetoothList");
		for (int i = 0 ; i < bluetoothList.size() ; i++ )
			bluetoothArrayAdapter.add(bluetoothList.get(i));
	}
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...