Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Java & Mobiles > Android
Android Forum d'entraide sur Android, la plateforme mobile de Google pour téléphones portables et Smartphones. Avant de poster -> FAQ Android
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/12/2012, 19h38   #1
abba_s
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 10
Points : 4
Points : 4
Par défaut Actualisation ListFragment après accès base de données

Bonjour,

En essayant de développer une appli android, je me trouve devant un problème qui commence à bien me taper sur les nerf

précision :
J'utilise la librairie ActionBarSherlock qui permet un support de l'actionbar dans des versions antérieures.

Dans ma classe FragmentActivity J'utilise un ViewPager et un TabAdapter comme dans l'exemple suivant

Je stocke les données à afficher dans uns base SQLite que j'ouvre avec un openhelper dans une classe dediée. J'affiche les données avec un SimpleCursorAdapter

Le seul (gros) problème c'est que chaque ajout/suppression n'est affichée qu'apres avoir fermé l'application (un appui sur home ne marche pas, un appui sur back si). Et ce, que ce soit en passant par l'action bar, la boite de dialogue ou le menu contextuel.

J'ai essayé avec une lib permettant d'utiliser un CursorLoader sans content provider https://github.com/commonsguy/cwac-loaderex mais même en appelant notifyDatasetChanged() ça ne marche pas.

Bref, je suis un peu a court de solutions et j'attends vos conseils avec dévotion

PS: j'ai vu qu'il était préférable de ne pas utiliser le thread UI pour ce genre d'opérations mais je préférerais d'abord maîtriser la chose sans passer par des AsyncTask sauf, bien sur si c'est vraiment obligatoire.

Merci d'avance pour toute aide.

Abba
abba_s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 12h25   #2
abba_s
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 10
Points : 4
Points : 4
Par example dans ma classe FragmentActivity

Code Java :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
public class MainActivity extends SherlockFragmentActivity {
 
    private ViewPager mViewPager;
    private TabsAdapter mTabsAdapter;	
 
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
 
    	setTheme(com.actionbarsherlock.R.style.Theme_Sherlock_Light);
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.activity_main);
        mViewPager = (ViewPager)findViewById(R.id.pager);
 
        ActionBar bar = getSupportActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
 
        mTabsAdapter = new TabsAdapter(this, mViewPager);
 
        mTabsAdapter.addTab(bar.newTab().setText("All").setTag("all"),
                        FragmentAll.class, null);
 mTabsAdapter.addTab(bar.newTab().setText("Creances").setTag("creances"),FragmentCreance.class, null);
 
        mTabsAdapter.addTab(
                bar.newTab().setText("Dettes").setTag("dettes"),
                FragmentDette.class, null);
 
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.activity_main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId() == R.id.new_op){
 
        	FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        	///Bundle bd=new Bundle();
        	//bd.putLong("id", -1);
        	DialogInsertOperation dio = DialogInsertOperation.newInstance(this,null);
        	dio.show(ft,"dio");
 
 
        	return true;
 
        }else if(item.getItemId() == R.id.supprimer_tout){
        	OperationsBDD obdd=new OperationsBDD(this);
        	obdd.open();
        	obdd.removeAllOperations();
        	obdd.close();
 
        	mTabsAdapter.notifyDataSetChanged();
 
        	return true;
        }else{
        	return false;
        }
    }
 
}

Quand je passe par :

Code Java :
1
2
3
4
5
6
7
8
9
10
11
 
else if(item.getItemId() == R.id.supprimer_tout){
     	OperationsBDD obdd=new OperationsBDD(this);
       	obdd.open();
       	obdd.removeAllOperations();
       	obdd.close();
 
       	mTabsAdapter.notifyDataSetChanged();
 
       	return true;
}

Les changements voulu sont bien appliqués mais seulement au redemarrage de l'appli.
abba_s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 00h03   #3
Feanorin
Responsable Android

 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 3 271
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 3 271
Points : 5 288
Points : 5 288
Envoyer un message via Skype™ à Feanorin
Bonjour,

J'ai lu rapidement mais ton problème n'est pas tout simplement que tu essayes mettre à jour ta TabsAdapteur alors que les données que tu modifies/ajoutes/supprimes n'appartiennent pas à un autre Adpater depuis tes Fragments ?
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 09h40   #4
abba_s
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 10
Points : 4
Points : 4
Bonjour,

Merci pour ta réponse.

Je remplis chaque ListFragment avec un SimpleCursorAdapter. Depuis le Fragment je demande une actualisation de cet adapter après une action sur le menu contextuel (qui est défini pour chaque fragment) mais le problème reste le même.

Serait-ce un autre adapter que je dois appeller ?
abba_s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 20h11   #5
Feanorin
Responsable Android

 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 3 271
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 3 271
Points : 5 288
Points : 5 288
Envoyer un message via Skype™ à Feanorin
Citation:
Je remplis chaque ListFragment avec un SimpleCursorAdapter. Depuis le Fragment je demande une actualisation de cet adapter après une action sur le menu contextuel (qui est défini pour chaque fragment) mais le problème reste le même.
Cela est normal, il faut donc tu que fasse un notifyDataSetChanged sur cet adapter (SimpleCursorAdapter) et non sur la TabAdapter.
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 20h41   #6
abba_s
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 10
Points : 4
Points : 4
Je me suis mal exprimé.
J'utilise déjà cette méthode pour essayer d'actualiser mais ça ne marche pas.
J'appelle en effet à la base depuis l'activity ( utilisation de l'actionBar ) mais aussi depuis le fragment quand le menu contextuel est utilisé. Et aucune des deux ne marche correctement.
abba_s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 08h46   #7
Feanorin
Responsable Android

 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 3 271
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 3 271
Points : 5 288
Points : 5 288
Envoyer un message via Skype™ à Feanorin
Bonjour,

Pourrais t on voir alors le code de ta Fragment qui met à jour ta liste ?
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 14h40   #8
abba_s
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 10
Points : 4
Points : 4
J'ai un ListFragment MyFragmenTab dont héritent plusieurs sortent de fragment dont le FragmentAll dont je met le code.

MyFragmentTab.java
Code Java :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
public abstract class MyFragmentTab extends SherlockListFragment {
 
	protected OperationsBDD obdd;
	protected SimpleCursorAdapter adapter;
 
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		obdd=new OperationsBDD(getActivity());
		obdd.open();
	}
 
	@Override
	public void onViewCreated(View view, Bundle savedInstanceState) {
		this.registerForContextMenu(getListView());
		super.onViewCreated(view, savedInstanceState);
	}
 
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
	                                ContextMenuInfo menuInfo) {
	    super.onCreateContextMenu(menu, v, menuInfo);
	    android.view.MenuInflater inflater = (android.view.MenuInflater)getSherlockActivity().getMenuInflater();
	    inflater.inflate(R.menu.context_menu, menu);
 
 
	}
 
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
 
		switch (item.getItemId()) {
	        case R.id.mcontext_modifier:
	            FragmentTransaction ft = getSherlockActivity().getSupportFragmentManager().beginTransaction();
	            Bundle bd= new Bundle();
	            bd.putLong("id",info.id);
	            DialogInsertOperation dio =DialogInsertOperation.newInstance(this.getSherlockActivity(),bd);
	        	dio.show(ft,"dialModif");
 
	        	adapter.notifyDataSetChanged();
	        	return true;
	        case R.id.mcontext_supprimer:
	            obdd.removeOperationByID((int)info.id);
	            adapter.notifyDataSetChanged();
	            return true;
	        default:
	            return super.onContextItemSelected(item);
	    }
	}
 
 
	@Override
	public void onDestroy() {
		if (obdd != null) {
			obdd.close();
		}
		super.onDestroy();
	}
 
}

FragmentAll.java
Code Java :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
public class FragmentAll extends MyFragmentTab {
 
	public FragmentAll() {
		super();
	}
 
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup group,
			Bundle saved) {
		return inflater.inflate(R.layout.frag_all, group, false);
	}
 
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		super.onCreate(savedInstanceState);
		Cursor crf = obdd.getAllOperations();
 
		if (crf != null) {
 
			adapter = new SimpleCursorAdapter(getSherlockActivity(),
					R.layout.affichage_item_all, crf, new String[] { "montant",
							"type", "name", "raison" }, new int[] {
							R.id.montant_view, R.id.type_op, R.id.nom,
							R.id.raison }, 0);
 
			setListAdapter(adapter);
		}
	}
}
abba_s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 00h02   #9
Feanorin
Responsable Android

 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 3 271
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 3 271
Points : 5 288
Points : 5 288
Envoyer un message via Skype™ à Feanorin
Bonjour,

Il s'avère que pour rafraichir des listes qui contiennent un cursor il faut passer par cela :
Code :
adapter.getCursor().requery();
Si tu as garder en mémoire le Cursor que tu as utilisé pour remplir ta listView tu peux le faire directement dessus
Donc :
Pas besoin du notifyDataSetChanged()

NB : cette commande est maintenant deprecated , il faut utiliser
Code :
adapter.changeCursor(myCursor);

http://developer.android.com/referen...#requery%28%29
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2013, 22h42   #10
abba_s
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 10
Points : 4
Points : 4
Meci beaucoup pour ton aide.Je vais enfin pouvoir avancer dessus ca fait super plaisir .
abba_s est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h02.


 
 
 
 
Partenaires

Hébergement Web