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

Composants graphiques Android Discussion :

ListView adapter passage de variable


Sujet :

Composants graphiques Android

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut ListView adapter passage de variable
    bonjour,
    une question pas très compliquée
    j'ai une listeview qui affiche une liste de date
    je veux mettre en surbrillance la prochaine date à venir

    Dans mon listviewadapter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // je regle mon format de date
    je calcule donc la date du jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    Date myDate = new Date(); // date du jour
    Date date2 = sdf.parse(today); // conversion en objet
    et je prend la date de mon array
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Date date1 = sdf.parse(date_en); // ou "date_en" est un string issu de ma base sqlite
    Calendar cal1 = Calendar.getInstance();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cal1.setTime(date1);
    cal2.setTime(date2);
    j'aimerai que dès qu'il trouve la prochaine date dans le calendrier il arrête de mettre un fond rouge
    du coup j'ai testé de déclarer une variable stop initialisée à 0 et qui passe à 1 dès que la condition suivante est remplie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if((cal1.after(cal2))||(cal1.equals(cal2))&&( STOP ==0)){
        		System.out.println("date1 est après date2 ou le même jour et STOP est égal à 0");
        		 STOP = 1; 
        		menuBack.setBackgroundColor( Color.parseColor("#FF0000") );
        	}

    mais cela ne fonctionne pas (la valeur reste à 0), une suggestion ?

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par freaks Voir le message
    je calcule donc la date du jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Date myDate = new Date(); // date du jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Date date1 = sdf.parse(date_en); // ou "date_en" est un string issu de ma base sqlite
    Pourquoi diable stocker une chaîne dans sqlite et pas un 'long' ? Cela éviterai les problèmes (éventuels de parsing), de gestion du cas ou la chaine est vide, de timezone (ben oui), etc..

    Ensuite, je ne comprends pas l’intérêt de passer par un Calendar (qui représente la version "locale" d'un objet "Date").
    Passer par un Calendar ne changera rien du tout...

    La comparaison entre deux dates, c'est juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (STOP==0 && date1.after(myDate)) {
       STOP=1;
       // background ....
    }
    Date: valeur absolue (nombre de millisecondes depuis le 1 jan 1970 GMT)
    Calendar: valeur "locale" (jour/mois/année/... dans le cas d'un calendrier Grégorien).
    DateFormat: formattage d'une date... Si on ne passe pas la locale & la timezone, DateFormat utilise les valeurs par défaut du device, donc une TimeZone variable... donc le parsing de "2012-10-10" (00:00:00.000) peut valoir "2012-10-09 23:00:00 GMT", et si la date courante est "2012-10-09 23:12" .... du coup ca va faire bizarre de voir "2012-10-09" (now) after "2012-10-10" (la valeur stockée dans la base)

    Pour toutes les raisons ci-dessus, on ne persiste (base de donnée, fichier, etc...) que des valeurs absolues (GMT par exemple, ou avec une timezone fixe), et la valeur la plus simple à stocker est un long, en utilsant:
    new Date(long) pour retrouver une Date.... et Date.getTime() pour récupérer le long.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    ok alors justement tu fais bien de parler de tout ça mais par exemple quand je crée ma table je fais ça
    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
     
    	private static final String TABLE = "table_event";
    	private static final String COL_ID = "id";
     
    	private static final String COL_CAT = "cat";
    	private static final String COL_AUTHOR = "author_id";
    	private static final String COL_TITLE = "title";
    	private static final String COL_DATE = "date";
    	private static final String COL_MP3 = "mp3";
     
    	private static final String CREATE_BDD = "CREATE TABLE " + TABLE + " ("
    	+ COL_ID + " TEXT NOT NULL, "
    	+ COL_CAT + " TEXT NOT NULL, "
    	+ COL_DATE + " DATE, "
    	+ COL_AUTHOR + " TEXT NOT NULL, "
    	+ COL_TITLE + " TEXT, "
    	+ COL_MP3 + " TEXT NOT NULL);";
    je stocke chaque valeur de date au format : YYYY/MM/DD (ex : 2012/11/02)
    donc quand je lis ma table et que je récup mon curseur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Cursor c =	bdd.rawQuery(MY_QUERY, null);
    je devrais envoyer ma valeur date de cette façon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Long date = c.getLong(2);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String date = c.getString(2);
    ?

    du coup j'ai pas très bien compris mais pour stocker correctement la valeur de la date je dois utiliser quel format ?

    surtout que la requete suivante ne fonctionne pas ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final String MY_QUERY = "SELECT * FROM table_event LEFT OUTER JOIN table_author ON table_event.author_id = table_author.id_author WHERE table_event.mp3 != '' ORDER BY table_event.date DESC";
    elle me renvoie tout les résultats et pas uniquement ceux supérieur à la date du jour .... :p

    Pour en revenir à la question de base maintenant effectivement cela fonctionne en revanche le surlignage disparait une fois que la listview a été scrollée :p

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par SQLite Documentation
    1.2 Date and Time Datatype

    SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:

    TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
    REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
    INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.
    TEXT est ce que tu utilises, mais pas correctement à la lecture/écriture je pense.
    REAL est l'équivalent dans d'autre languages de DATE/TIMESTAMP etc... Très pratique coté utilisation "query", pas très pratique coté transformation en Java.
    INTEGER est le plus pratique, mais le moins "lisible" humainement.

    Donc par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	private static final String CREATE_BDD = "CREATE TABLE " + TABLE + " ("
    	+ COL_ID + " TEXT NOT NULL, "
    	+ COL_CAT + " TEXT NOT NULL, "
    	+ COL_DATE + " INTEGER, "
    	+ COL_AUTHOR + " TEXT NOT NULL, "
    	+ COL_TITLE + " TEXT, "
    	+ COL_MP3 + " TEXT NOT NULL);";
    Lecture d'un curseur:
    Cas 1: TEXT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS",Locale.US);
    sdf.setTimeZone(TimeZone.getInstance("UTC"));
    Date d = (c.isNull(2)) ? null : sdf.parse(c.getString(2));
    Cas 2: REAL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Date d = (c.isNull(2)) ? null : new Date(Double.valueOf(c.getDouble(2) * 86400000.0).longValue());
    Cas 3: INTEGER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Date d = (c.isNull(2)) ? null : new Date(c.getLong(2)*1000);
    Code le plus simple ? INTEGER.

    Ecriture de données
    Cas 1: TEXT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS",Locale.US);
    sdf.setTimeZone(TimeZone.getInstance("UTC"));
    setValue(sdf.format(date));
    Cas 2: REAL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setValue(((double)date.getTime()) / 86400000.0);
    Cas 3: INTEGER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setValue(date.getTime()/1000);
    Code le plus simple ? INTEGER.

    surtout que la requete suivante ne fonctionne pas ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final String MY_QUERY = "SELECT * FROM table_event LEFT OUTER JOIN table_author ON table_event.author_id = table_author.id_author WHERE table_event.mp3 != '' ORDER BY table_event.date DESC";
    Ben si, dans les trois cas le "order" est respecté... que ce soit INTEGER, TEXT ou REAL....

    elle me renvoie tout les résultats et pas uniquement ceux supérieur à la date du jour .... :p
    C'est normal il n'y a pas de "where table_event.date>=date('now')"
    Mais normalement, dans les 3 cas, le "order" doit fonctionner, comme les tests de valeur.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    On notera toutefois, que la notation "INTEGER" est la moins précise des 3 (puisque ne stock *que* les secondes)....
    Personnellement, je n'utilise jamais les "fonctions" de date de SQLite, et je stocke directement les milliseconds donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Date dt = c.isNull(2) ? null : new Date(c.getLong(2));
    setValue(dt.getTime());
    Et dans les queries, c'est moi qui passe le 'now':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    static String RAW_SQL = "select * from TOTO where MY_DATE>?";
    rawQuery(RAW_SQL,new String[] { Long.toString(System.currentTimeMillis()); });
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    hello franchement merci beaucoup pour ta réponses ça m'aide beaucoup à y voir clair
    j'ai réussi mon code grâce à cela
    merci encore

    en revanche j'ai toujours la petite erreur pour la surbrillance d'un item, qui fonctionne quand on arrive dans l'activité mais en faisant défiler la liste et en revenant ensuite vers l'item la surbrillance à disparue :p

    A priori une fois que la variable STOP est égale à 1 cela fonctionne sur le coup, mais ensuite elle ne doit pas être recalculée lors du "glissement" de la vue :p

  7. #7
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    On peut voir le code complet de l'adapter ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
     
    public class ActuListViewAdapter extends BaseAdapter {
    	 private static int STOP = 0;
    	private Activity activity;
    	 private ArrayList<HashMap<String, String>> data;
    	 private static LayoutInflater inflater=null;
    	 private Context context;
    	 private String cat_actu;
    	 private View menuBack;
    	public ActuListViewAdapter(ActuActivity actuActivity,ArrayList<HashMap<String, String>> contactList) {
    		// TODO Auto-generated constructor stub
    		activity = actuActivity;
            data=contactList;STOP = 0;
    	    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     
    	}
     
    	public int getCount() {
    		return data.size();
    		// TODO Auto-generated method stub
     
    	}
     
    	public Object getItem(int position) {
    		// TODO Auto-generated method stub
    		 return position;
    	}
     
    	public long getItemId(int position) {
    		// TODO Auto-generated method stub
    		 return position;
    	}
     
    	public View getView(int position, View convertView, ViewGroup parent) {
    		// TODO Auto-generated method stub
    		String clr = "";
     
    		 View vi=convertView;
            vi = inflater.inflate(R.layout.openmotion_actu_listitem, null);
            ImageView icon = (ImageView)vi.findViewById(R.id.icon); // title
            TextView title = (TextView)vi.findViewById(R.id.title); // title
            TextView date = (TextView)vi.findViewById(R.id.date); // date
            TextView id = (TextView)vi.findViewById(R.id.id_event); // date
           View menuBack = (View)vi.findViewById(R.id.menu_layout);
     
     
            HashMap<String, String> song = new HashMap<String, String>();
            song = data.get(position);
     
            // Setting all values in listview
           cat_actu = song.get(ActuActivity.KEY_CAT);
           MainApp.log("test => "+cat_actu);
            String[] date_actuS = song.get(ActuActivity.KEY_DATE).split("-");
            String date_en = date_actuS[0]+"-"+date_actuS[1]+"-"+date_actuS[2];
            String date_fr = date_actuS[2]+"-"+date_actuS[1]+"-"+date_actuS[0];
            date.setText(date_fr);
            title.setText(song.get(ActuActivity.KEY_TITLE));
            id.setText(song.get(ActuActivity.KEY_ID));
            if(cat_actu.equals("ktTfU8u")){ icon.setVisibility(View.INVISIBLE);}
     
            MainApp.log("test => "+cat_actu);
     
     
            try{
            	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            	// date array
            	Date date1 = sdf.parse(date_en);
            	// date aujourdhui
            	Date myDate = new Date();
    // pour mettre en surbrillance la prochaine date à partir d'aujourd'hui
        	if (STOP==0 && date1.after(myDate)) {
        		System.out.println("Date1 is after Date2");
        		STOP = 1; 
        		menuBack.setBackgroundColor( Color.parseColor("#FF0000") );
        	}
     
     
     
     
     
     	}catch(ParseException ex){
     		ex.printStackTrace();
     	} catch (java.text.ParseException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
     
            // pour changer la couleur d'une ligne sur deux
            clr = "D4D4D4";
            int newvab = position%2;
    		if(newvab == 1) {
    			menuBack.setBackgroundColor( Color.parseColor("#" + clr) );
    		}
     
     
            return vi;
    	}
     
     
     
    	}

  9. #9
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Haaaa ben oui... c'est normal alors... il y aura la surbrillance une fois... puis plus jamais....

    En fait, il faut que l'adapter contienne la position (ou l'identifiant c'est plus sur) de l'item à mettre en surbrillance....

    Par exemple pendant le constructeur.... on cherche la position du premier élément et on stocke cette position....

    Ensuite dans le getView, tout devient plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (position == this.highlightPosition) {
       xxxx.setBackgroundColor(...);
    } else {
       xxxx.setBackgroundColor( (position % 2 == 1) ? .... : .... );
    }
    D'autre part, ce code là est inutile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    View vi=convertView;
            vi = inflater.inflate(R.layout.openmotion_actu_listitem, null);
    En fait l'adapter n'utilise jamais la convertView... ce qui est dommage quand même...
    Il suffit de remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    View vi = (convertView == null) ? inflater.inflate(R.layout.openmotion_actu_listitem, null) : convertView;
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    ok merci effectivement je vais faire comme ça
    merci

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

Discussions similaires

  1. [langage] Probleme passage de variables entre modules
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 13/08/2004, 12h25
  2. Passage de variable dans un lien asp
    Par VirginieGE dans le forum ASP
    Réponses: 4
    Dernier message: 27/07/2004, 10h06
  3. [Kylix] passage de variable en Libc
    Par zheng dans le forum EDI
    Réponses: 11
    Dernier message: 06/05/2004, 14h14
  4. Passage de variable par methode post ?
    Par oazar dans le forum Flash
    Réponses: 33
    Dernier message: 16/10/2003, 17h03
  5. [langage] Passage de variables...
    Par martijan dans le forum Langage
    Réponses: 8
    Dernier message: 30/07/2003, 09h48

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