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 :

Création d'une liste avec détails


Sujet :

Android

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Création d'une liste avec détails
    Bonjour à tous,
    Je suis en 2ème année de DUT Informatique et j'ai un projet tuteuré à développer. Nous avons choisi de développer une application Androïd, mais du coup on tombe sur des problèmes de programmation qui nous paraissent vraiment compliqués.

    Voilà le schéma de notre application :
    - Une base de données sous MySQL qui contient diverses informations (base consistante)
    - Un site "d'administration" qui nous permet de gérer les informations de la BD, la mettre à jour, qui nous sert aussi à éditer des statistiques à gérer les utilisateurs , etc ...
    - Puis viens ensuite l'appli Android qui aura pour but de restituer les informations contenues dans la BD.

    Le système est plutôt simple et basique, mais on cale assez rapidement quant à la prog' de l'appli...

    Par exemple, j'ai réussi à afficher une liste de tous les clubs présents dans la BD, mais maintenant j'aimerais afficher cette même liste avec des détails : pouvoir afficher le CP, ou la ville ou autres. J'ai vu qu'on pouvait faire cela avec des SimpleCursorAdapter, DoubleListView ou je sais plus trop quoi, je me perds un peu dans tout ça.

    Vous allez me dire qu'il existe des tutos pour ça, comme celui là : http://a-renouard.developpez.com/tut...iser-listview/ mais je n'arrive pas à combiner les informations sachant qu'elles proviennent d'une BD et qu'on ne les rajoute pas manuellement.

    Merci pour votre aide !

  2. #2
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut
    salut
    oui tu devras utiliser simpleCursorAdapter parce qu'il est à utiliser avec les base de données.
    tu devras créer un Cursor qui sera chargé de récupérer les données de la BD
    puis avec le simpleCursorAdapter tu mettras le contexte, le layout à appliquer à chaque item de la liste, les données à extraire de la bd et les widget correspondant à chaque donnée(ville, cp,etc).
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void DataBind(){
    		  // récupération liste de formations
    	    	Cursor c = formationBdd.recupererListeFormations();
    	    	startManagingCursor(c);
    	    	SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
    	    	R.layout.list_item,c,new String[]{"libellé","tel","email","adresse","ville","catégorie"},
    	    	new int[]{R.id.textLibellé,R.id.TextTel,R.id.TextEmail,R.id.TextAdresse,R.id.TextVille,R.id.TextCatégorie});
    	    	setListAdapter(adapter);
    	    }
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    merci pour la réponse rapide !

    J'ai essayé de faire ce que tu m'as dis, mais ma méthode ne retourne pas un Cursor mais une ArrayList (les données retournées par la requête sont stockées dans l'ArrayList), comment je pourrais faire du coup ?
    Voici le code de ma méthode :
    Code : 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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
        public ArrayList<String> ExecutionRequeteSimple (String url, String NomColonneRecherchee)
        {
        	 String result = null;
             InputStream is = null;
             JSONObject json_data=null;
             ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
             // ArrayList<String> titre = new ArrayList<String>();
             ArrayList<String> ResultatRequete = new ArrayList<String>();
             HttpPost httppost = new HttpPost(url);
     
             try
             {
            	//commandes httpClient
     
            	Log.i("log_tag","je vais aller voir le php"); 
     
            	HttpClient httpclient = new DefaultHttpClient();
     
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
             }
             catch(Exception e)
             {
            	Log.e("taghttppost",""+e.toString());
                Toast.makeText(getBaseContext(),e.toString() ,Toast.LENGTH_LONG).show();
             }
     
     
             //conversion de la réponse en chaine de caractère
             try
             {
                Log.i("log_tag","je convertie"); 
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
                StringBuilder sb  = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) 
                {
                	sb.append(line + "\n");
                }
                is.close();
                result = sb.toString();
             }
             catch(Exception e)
             {
                Log.e("tagconvertstr",""+e.toString());
             }
     
             //recuperation des donnees json
             try
             {
                JSONArray jArray = new JSONArray(result);
                for(int i=0;i<jArray.length();i++)
                {
                	json_data = jArray.getJSONObject(i);
                    ResultatRequete.add(json_data.getString(NomColonneRecherchee));
                    //r.add(json_data.getString("categorie"));
                }
                // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, titre);
                // setListAdapter(adapter);   
     
             }
             catch(JSONException e)
             {
                Log.e("tagjsonexp",""+e.toString());
             } 
             catch (ParseException e) 
             {
                Log.e("tagjsonpars",""+e.toString());
             }
     
             return ResultatRequete;
     
     
        }
    Mais depuis j'ai une autre question qui me vient à l'esprit : dans la base de données qu'on a sur notre serveur, on a grosse quantité de données (près de 3000 enregistrements dans chaque table). Je me demande alors si il serait pas plus performant d'intégrer une base SQLite directement dans l'appli qui se synchronise à celle du serveur au démarrage de l'appli comme ça les traitements se feront directement sur la BD locale et prendront du coup moins de temps à s’exécuter. Cette solution me parait la plus plausible car en ce moment lors d'une requête d'affichage de tous les enregistrements d'une table (donc près de 3000 enregistrements) d'une ListView, l'appli met presque 10 secondes le temps de tout afficher ...

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Il te suffit de faire un adapter custom qui dérive de arrayAdapter.
    un truc du genre :

    Code : 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
    public class MyAdapter extends ArrayAdapter<MyTypeInArrayList> 
    {
    	/** Inflater de vue */
    	private LayoutInflater inflater;
     
    	/** Liste des éléments */
    	private ArrayList items;
     
    	public MyAdapter(Context context, int textViewResourceId,ArrayList items) {
    		super(context, textViewResourceId, items);
    		this.items 	= items;
    		inflater 	= LayoutInflater.from(context);
    	}
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent)
    	{
    		ViewHolder holder;
    		if(convertView == null) 
    		{
    			convertView 	= inflater.inflate(R.layout.malistview, null);
     
    			holder.name = (TextView) convertView.findViewById(R.id.name);
    			convertView.setTag(holder);
     
    		}
    		else
    		{
    			holder = (ViewHolder) convertView.getTag();
    		}
     
    		MyTypeInArrayList item = this.items.get(position);
    		if(item != null)
    		{
    			holder.name.setText('hello')
    		}
     
    		return convertView;
    	}
     
    	static private class ViewHolder {
     
    		TextView name;
    	}
    }
    Tu as un exemple complet avec l'explication du pattern viewHolder là : http://www.jmanzano.es/blog/?p=166

    pour ce qui est de ta base le problème ne vient pas du fait qu'elle soit distante mais que tu veux afficher 3000 lignes d'un coup.

    Fait du lazy loading , avec les enregistrements qui se charge au fur et à mesure que tu scroll. une recherche sur "endless Adapter implementation" devrais t'aider.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,
    merci de l'aide que vous m'apportez, grâce à vos conseils j'ai pu pas mal avancer sur l'appli !
    Maintenant, j'ai réussi à faire toutes mes listes comme je veux, avec des petites images et compagnie, tout va bien, sauf que je retombe toujours sur le même problème : le temps de chargement des pages !
    J'ai regardé du côté du LazyLoading, les codes que je trouve sur le net me paraissent être du Chinois ! Du coup je pense que je vais me faire un petit truc maison : je n'affiche que 15 éléments, puis je mets un dernier élément dans la liste "Résultats suivants" pour afficher les 15 suivants, ainsi de suite ...

    Ensuite, on a travaillé sur la géolocalisation, c'est merveilleux, ça marche du tonnerre, ça me trouve sur la carte, j'ai crée mes marqueurs, SAUF que j'ai 3000 marqueurs, et que mon vieux HTC Wildfire il supporte pas trop ça ... J'ai donc pensé à du LazyLoading aussi pour afficher les marqueurs sur la carte "en différé", j'ai trouvé ça qui m'a l'air parfait : http://code.google.com/p/mapview-overlay-manager/ mais je n'ai aucune idée de la manière de s'en servir, j'ai beau lire le Wiki, tout reste trop abstrait ... Si quelqu'un connait ce module ?

    Merci beaucoup en tout cas

Discussions similaires

  1. Création d'une liste avec un élément flèche
    Par Geo-x dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 29/06/2015, 17h19
  2. [AC-2013] Création d'une liste avec cases à cocher
    Par boroti dans le forum Modélisation
    Réponses: 2
    Dernier message: 17/06/2015, 17h27
  3. Création d'une liste d'affaire avec sql
    Par christophe.65 dans le forum VB.NET
    Réponses: 0
    Dernier message: 06/05/2009, 13h49
  4. Réponses: 7
    Dernier message: 07/11/2008, 10h45
  5. Réponses: 5
    Dernier message: 13/10/2005, 10h19

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