Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    31

    [Android] Ordinare ArrayList

    (android)Ciao, ho una ListView popolata dai 12 mesi dell'anno e per ogni mese vengono associati i dati prelevati dal database.
    Sono in ordine crescente, ora vorrei dare la possibilità di scegliere se visualizzarli in ordine crescente o decrescente.
    Avete qualche idea? posto il codice con l'Adapter e ArrayList...
    codice:
    
    
    codice:
    private void mesi(String anno){
                    SQLiteDatabase db = new ResgistroSpeseHelper(getActivity()).getReadableDatabase();
                    final List<Dettaglio> dettagli = new ArrayList<MesiFragment.Dettaglio>(12);
    
                            for (int i=1; i<=12; i++){
                            String mese;
                            if (i<10){
                                    mese = "0"+i;
                            } else {
                                    mese = ""+i;
                            }
    
                   String sql = "SELECT SUM(punteggio) FROM punti WHERE data LIKE '"+anno+"-"+mese+"%'";
                            Cursor c = db.rawQuery(sql, null);
    
                            while (c.moveToNext()){
                                    Dettaglio d = new Dettaglio();
    
                                    d.punteggio = c.getDouble(0);
    
                                    dettagli.add(d);
                            }
    
                            c.close();
                    }
    
                    db.close();
    // Dopo questa chiamata, l'ArrayList "dettagli" sarà invertito
    		Collections.reverse( dettagli );
                    ListAdapter adapter = new ArrayAdapter<Dettaglio>(getActivity(), R.layout.dettaglio_punteggi, R.id.tv_mese, dettagli){
    
                            @Override
                            public View getView(int position, View convertView, ViewGroup parent) {
                                    View row = super.getView(position, convertView, parent);
    
                                    final String month = new DateFormatSymbols(Locale.getDefault()).getMonths()[position];
    ...
    ...
    

    Ultima modifica di GffJkc; 07-05-2014 a 16:19

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    A seconda se vuoi l'ordinamento originario o quello inverso, dovrai passare al ArrayAdapter una lista con un ordine piuttosto che l'altro.

    Hai l'ArrayList nell'ordine "normale" (da 1 a 12) e lo vuoi invertire?

    codice:
    // Dopo questa chiamata, l'ArrayList "dettagli" sarà invertito
    Collections.reverse( dettagli );
    
    // Ora puoi passare tranquillamente l'ArrayList all ArrayAdapter
    ListAdapter adapter = new ArrayAdapter<Dettaglio>(getActivity(), R.layout.dettaglio_punteggi, R.id.tv_mese, dettagli) {
       ...
    }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    31
    Dunque chiamando il metodo Collections.reverse(), vedo ancora la lista da 1 a 12. Vedi codice sopra.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    31
    Sono invertiti i dati del database, ma non i mesi, ora vedrò come posso fare. Grazie

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Beh... è ovvio: il mese lo recuperi a parte direttamente dentro l'ArrayAdapter (che non sa nulla del fatto che il contenuto sia invertito oppure no) guardando la "posizione"...


    codice:
    final String month = new DateFormatSymbols(Locale.getDefault()).getMonths()[position];

    Cioè... quando la View richiede l'elemento in posizione 0 tu vai a prendere il mese "0", che è Gennaio... ma l'arrayadapter non può sapere che l'elemento in posizione 0 dell'ArrayList è relativo al mese di dicembre.

    Questo perchè hai disaccoppiato due cose che dovevano viaggiare assieme. Il mese ed il relativo valore.
    Avresti dovuto modellare meglio la cosa: la classe Dettaglio dovrebbe contenere sia l'indicazione del mese di riferimento, che il valore di quel mese... in questo modo puoi evitare di andare a prendere il mese usando "position", ma andandolo a prendere direttamente nel dato (cioè, in Dettaglio).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    31
    Hai ragione, a questo punto per semplificare il tutto modifico la query, raggrupando i dati con i relativi mesi e li ordino con la clausola ORDER BY.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.