Aller au contenu

TabActivity + Listview x 2


Invité

Recommended Posts

Bonjour à tous!

Je suis en train de développer une application dans laquelle j'utilise une TabActivty.

Celle-ci contient 3 onglets (Consultants, Missions, Clients).

J'ai également créé une base de données qui contient ma table de consultants, et ma table de clients.

Si pour l'affichage d'une liste je n'ai rencontré aucun problème, dès que je veux en afficher deux (une liste dans chaque onglet), là plus rien de s'affiche!!

[EDIT] : J'avais oublié de mettre à jour le numéro de version de la base de données. Du coup les deux listview s'affichent, mais elles affichent la même chose ( liste des consultants)

[EDIT2] : Bon, j'ai trouvé le problème. Il ne faut pas passer par les classes ConsultantsGroup et ClientsGroup. Il suffit de directement appelé les classes qui créent les listes

Voici le code:

TabActivity :

public class WebGo extends TabActivity {


public TabHost tabHost;


@Override
protected void onCreate(Bundle savedInstanceState) {
	// TODO Auto-generated method stub
	super.onCreate(savedInstanceState);
	setContentView(R.layout.webgo_layout);


	Resources res = getResources(); // Resource object to get Drawables
    TabHost tabHost = getTabHost();  // The activity TabHost
    TabHost.TabSpec spec;  // Resusable TabSpec for each tab
    Intent intentConsultants; 
    Intent intentMissions;
    Intent intentClients;


    // Create an Intent to launch an Activity for the tab (to be reused)
    intentConsultants = new Intent().setClass(this, ConsultantsGroup.class);

    // Initialize a TabSpec for each tab and add it to the TabHost
    spec = tabHost.newTabSpec("consultants").setIndicator("Consultants",
                      null)
                  .setContent(intentConsultants);
    tabHost.addTab(spec);

    // Do the same for the other tabs
    intentMissions = new Intent().setClass(this, MissionsGroup.class);
    spec = tabHost.newTabSpec("missions").setIndicator("Missions",
                      null)
                  .setContent(intentMissions);
    tabHost.addTab(spec);

    intentClients = new Intent().setClass(this, ClientsGroup.class);
    spec = tabHost.newTabSpec("clients").setIndicator("Clients",
                      null)
                  .setContent(intentClients);
    tabHost.addTab(spec);

    tabHost.setCurrentTab(0);


}

}

ConsultantsGroup: (Ne sert qu'à lancer l'activty ConsultantsList et récupérer sa view)

J'ai exactement le même code pour ClientsGroup si ce n'est qu'il lance l'activity ClientsList

public class ConsultantsGroup extends ActivityGroup {
 // Keep this in a static variable to make it accessible for all the nesten activities, lets them manipulate the view  
     public static ConsultantsGroup group;  

     // Need to keep track of the history if you want the back-button to work properly, don't use this if your activities requires a lot of memory.  
     private ArrayList<View> history;  

     @Override  
     protected void onCreate(Bundle savedInstanceState) {  
           super.onCreate(savedInstanceState);  
           this.history = new ArrayList<View>();  
           group = this;  

               // Start the root activity withing the group and get its view  
           View view = getLocalActivityManager().startActivity("ConsultantsList", new  
                                             Intent(this,ConsultantsList.class)  
                                             .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))  
                                             .getDecorView();  

               // Replace the view of this ActivityGroup  
           replaceView(view);  

        }  

     public void replaceView(View v) {  
                 // Adds the old one to history  
         history.add(v);  
                 // Changes this Groups View to the new View.  
         setContentView(v);  
     }  

     public void back() {  
         if(history.size() > 0) {  
             history.remove(history.size()-1);  
             setContentView(history.get(history.size()-1));  
        }else {  
             finish();  
         }  
     }  

    @Override  
     public void onBackPressed() {  
    	ConsultantsGroup.group.back();  
         return;  
     }  

}  

ConsultantsList:

public class ConsultantsList extends ListActivity {

private static final int ACTIVITY_SHOW_CONSULTANT = 0;
private ConsultantsDbAdapter cDbAdapter;
private Cursor mConsultansCursor;	

@Override
protected void onCreate(Bundle savedInstanceState) {
	// TODO Auto-generated method stub
	super.onCreate(savedInstanceState);

	ListView lv = new ListView(ConsultantsList.this);    
       lv.setId(android.R.id.list); //

--------> Obligé de mettre cet id sinon on obtient une erreur

  lv.setDivider(null);
       lv.setFastScrollEnabled(true);
       setContentView(lv);

	// Affichage des consultants sauvegardés en base:
       cDbAdapter = new ConsultantsDbAdapter(this);
	cDbAdapter.open();

	mConsultansCursor = cDbAdapter.fetchAllConsultants();

	Log.i("CONSULTANT LIST", "TEST");
/*	
	mConsultansCursor = cDbAdapter.fetchAllConsultants();
	startManagingCursor(mConsultansCursor);
	*/
	// On spécifie les éléments que l'on veut afficher dans la liste
       String[] from = new String[]{ConsultantsDbAdapter.KEY_NOM , ConsultantsDbAdapter.KEY_PRENOM};

       // Ici, on spécifie la destination vers laquelle on affichera les éléments sélectionnés ci-dessus
       int[] to = new int[]{R.id.nom_consultant, R.id.prenom_consultant};

       // Now create a simple cursor adapter and set it to display
      /* SimpleCursorAdapter consultants = 
           new SimpleCursorAdapter(this, R.layout.consultant_row, mConsultansCursor, from, to);
      */

	lv.setAdapter(
				new MyCursorAdapter(
						getApplicationContext(),
						R.layout.consultant_row,
						mConsultansCursor,						
						from,										
					    to));

      // MyCursorAdapter consultants = new MyCursorAdapter(this, R.layout.consultant_row, mConsultansCursor, from, to);
      // setListAdapter(consultants);

}

 @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Cursor c = mConsultansCursor;
        c.moveToPosition(position);
        Intent i = new Intent(this, Consultant.class);
        i.putExtra(ConsultantsDbAdapter.KEY_ROWID, id);
        i.putExtra(ConsultantsDbAdapter.KEY_NOM, c.getString(
                c.getColumnIndexOrThrow(ConsultantsDbAdapter.KEY_NOM)));
        i.putExtra(ConsultantsDbAdapter.KEY_PRENOM, c.getString(
                c.getColumnIndexOrThrow(ConsultantsDbAdapter.KEY_PRENOM)));
        i.putExtra(ConsultantsDbAdapter.KEY_ADRESSE, c.getString(
                c.getColumnIndexOrThrow(ConsultantsDbAdapter.KEY_ADRESSE)));
        i.putExtra(ConsultantsDbAdapter.KEY_EMAIL, c.getString(
                c.getColumnIndexOrThrow(ConsultantsDbAdapter.KEY_EMAIL)));
        i.putExtra(ConsultantsDbAdapter.KEY_FONCTION, c.getString(
                c.getColumnIndexOrThrow(ConsultantsDbAdapter.KEY_FONCTION)));
        i.putExtra(ConsultantsDbAdapter.KEY_TELEPHONE, c.getString(
                c.getColumnIndexOrThrow(ConsultantsDbAdapter.KEY_TELEPHONE)));     
        startActivityForResult(i, ACTIVITY_SHOW_CONSULTANT);

    }

 public class MyCursorAdapter extends SimpleCursorAdapter implements
	SectionIndexer {

AlphabetIndexer alphaIndexer;

public MyCursorAdapter(Context context, int layout, Cursor c,
		String[] from, int[] to) {
	super(context, layout, c, from, to);		
	alphaIndexer= new AlphabetIndexer(c, mConsultansCursor.getColumnIndex(ConsultantsDbAdapter.KEY_NOM), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 
}

@Override
public int getPositionForSection(int section) {
	return alphaIndexer.getPositionForSection(section);
}

@Override
public int getSectionForPosition(int position) {
	return alphaIndexer.getSectionForPosition(position);
}

@Override
public Object[] getSections() {
	return alphaIndexer.getSections();
}

}
}

De même pour l'activité qui gère la liste des clients:

ClientsList:

public class ClientsList extends ListActivity {
	private static final int ACTIVITY_SHOW_CLIENT = 0;
	private ClientsDbAdapter clDbAdapter;
	private Cursor mClientsCursor;	


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

		ListView lv2 = new ListView(ClientsList.this);    
        lv2.setId(android.R.id.list); //

----> Toujours obligé de garder cet id , je pense que le problème est ici, mais je ne sais pas comment faire !!

	       
               lv2.setDivider(null);
        lv2.setFastScrollEnabled(true);
        setContentView(lv2);

		// Affichage des consultants sauvegardés en base:
        clDbAdapter = new ClientsDbAdapter(this);
        clDbAdapter.open();

        mClientsCursor = clDbAdapter.fetchAllClients();

		Log.i("CLIENT LIST", "TEST");
	/*	
		mConsultansCursor = cDbAdapter.fetchAllConsultants();
		startManagingCursor(mConsultansCursor);
		*/
		// On spécifie les éléments que l'on veut afficher dans la liste
        String[] from = new String[]{ClientsDbAdapter.KEY_NOM};

        // Ici, on spécifie la destination vers laquelle on affichera les éléments sélectionnés ci-dessus
        int[] to = new int[]{R.id.nom_client};


		lv2.setAdapter(
					new MyCursorAdapter(
							getApplicationContext(),
							R.layout.client_row,
							mClientsCursor,						
							from,										
						    to));


	}

	 @Override
	    protected void onListItemClick(ListView l, View v, int position, long id) {
	        super.onListItemClick(l, v, position, id);
	        Cursor c = mClientsCursor;
	        c.moveToPosition(position);
	        Intent i = new Intent(this, Consultant.class);
	        i.putExtra(ClientsDbAdapter.KEY_ROWID, id);
	        i.putExtra(ClientsDbAdapter.KEY_NOM, c.getString(
	                c.getColumnIndexOrThrow(ClientsDbAdapter.KEY_NOM)));
	        i.putExtra(ClientsDbAdapter.KEY_ADRESSE, c.getString(
	                c.getColumnIndexOrThrow(ClientsDbAdapter.KEY_ADRESSE)));
	        i.putExtra(ClientsDbAdapter.KEY_CONTACT, c.getString(
	                c.getColumnIndexOrThrow(ClientsDbAdapter.KEY_CONTACT)));
	        i.putExtra(ClientsDbAdapter.KEY_TELEPHONE, c.getString(
	                c.getColumnIndexOrThrow(ClientsDbAdapter.KEY_TELEPHONE)));     
	        startActivityForResult(i, ACTIVITY_SHOW_CLIENT);

	    }

	 public class MyCursorAdapter extends SimpleCursorAdapter implements
		SectionIndexer {

	AlphabetIndexer alphaIndexer;

	public MyCursorAdapter(Context context, int layout, Cursor c,
			String[] from, int[] to) {
		super(context, layout, c, from, to);		
		alphaIndexer= new AlphabetIndexer(c, mClientsCursor.getColumnIndex(ClientsDbAdapter.KEY_NOM), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 
	}

	@Override
	public int getPositionForSection(int section) {
		return alphaIndexer.getPositionForSection(section);
	}

	@Override
	public int getSectionForPosition(int position) {
		return alphaIndexer.getSectionForPosition(position);
	}

	@Override
	public Object[] getSections() {
		return alphaIndexer.getSections();
	}

}
}


Je sais que ça fait pas mal de code à étudier, mais un ptit coup de main la dessus m'enlèverait une belle épine du pied !! ^^

Lien vers le commentaire
Partager sur d’autres sites

J'ai un problème similaire.

J'ai 2 onglets et 2 listes à afficher (une dans chaque).

Actuellement, quand je clic sur l'onglet 2, j'ai pas de liste dessiné ....

Il existe un moyen sans créer plusieurs classes pour faire cela ? (j'aimerai cantonner la gestion des 2 tab a une classe ) ?

Merci

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...