IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Actualisation ListFragment après accès base de données


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 6
    Points
    6
    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

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 6
    Points
    6
    Par défaut
    Par example dans ma classe FragmentActivity

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    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 ?
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 6
    Points
    6
    Par défaut
    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 ?

  5. #5
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    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.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 6
    Points
    6
    Par défaut
    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.

  7. #7
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Pourrais t on voir alors le code de ta Fragment qui met à jour ta liste ?
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 6
    Points
    6
    Par défaut
    J'ai un ListFragment MyFragmenTab dont héritent plusieurs sortent de fragment dont le FragmentAll dont je met le code.

    MyFragmentTab.java
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
    		}
    	}
    }

  9. #9
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Il s'avère que pour rafraichir des listes qui contiennent un cursor il faut passer par cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    adapter.changeCursor(myCursor);

    http://developer.android.com/referen...#requery%28%29
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 6
    Points
    6
    Par défaut
    Meci beaucoup pour ton aide.Je vais enfin pouvoir avancer dessus ca fait super plaisir .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accès base de données après installation sur autre poste
    Par premiumbfd dans le forum Windows Forms
    Réponses: 4
    Dernier message: 11/10/2009, 09h19
  2. [PHPMyAdmin] Accès base de donnée pour utilisateur
    Par nicodeme dans le forum Outils
    Réponses: 2
    Dernier message: 04/03/2006, 01h10
  3. [C#]Global.asax et accès base de données.
    Par R'SKaP dans le forum ASP.NET
    Réponses: 13
    Dernier message: 26/01/2006, 15h00
  4. est ce que d'apres une base de données en access,
    Par loveflower dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 26/10/2004, 16h12
  5. [Kylix] Kylix et accès Base de données
    Par Oyoboy dans le forum EDI
    Réponses: 16
    Dernier message: 22/06/2004, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo