Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité de passage
    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 : 3
    Points
    3

    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
    Invité de passage
    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 : 3
    Points
    3

    Par défaut

    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.

  3. #3
    Responsable Android

    Avatar de Feanorin
    Inscrit en
    avril 2004
    Messages
    4 070
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 4 070
    Points : 6 593
    Points
    6 593

    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 ?

  4. #4
    Invité de passage
    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 : 3
    Points
    3

    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
    Responsable Android

    Avatar de Feanorin
    Inscrit en
    avril 2004
    Messages
    4 070
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 4 070
    Points : 6 593
    Points
    6 593

    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.

  6. #6
    Invité de passage
    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 : 3
    Points
    3

    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
    Responsable Android

    Avatar de Feanorin
    Inscrit en
    avril 2004
    Messages
    4 070
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 4 070
    Points : 6 593
    Points
    6 593

    Par défaut

    Bonjour,

    Pourrais t on voir alors le code de ta Fragment qui met à jour ta liste ?

  8. #8
    Invité de passage
    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 : 3
    Points
    3

    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 :
    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);
    		}
    	}
    }

  9. #9
    Responsable Android

    Avatar de Feanorin
    Inscrit en
    avril 2004
    Messages
    4 070
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 4 070
    Points : 6 593
    Points
    6 593

    Par défaut

    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

  10. #10
    Invité de passage
    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 : 3
    Points
    3

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •