Autore Topic: Creazione di un Dialog con una lista variabile  (Letto 1295 volte)

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Creazione di un Dialog con una lista variabile
« il: 14 Luglio 2012, 00:14:27 CEST »
0
Ciao, è tutta la sera che ci st lavorando. Vorrei un Dialog per la selezione di un qualcosa. Gli item li prendo dal db. Ho esteso AlertDialog e ArrayAdapter in modo da poter lavorarci su...ma non so se è stata una buona scelta. Vi posto il codice:

AlertDialog:
Codice (Java): [Seleziona]
public class CountriesDialog extends AlertDialog {

        private Context context;
        private Vector<String> countries;
        private ListView listView;
        private CountriesAdapter adapter;

        public CountriesDialog(Context context, Vector<String> countries) {
                super(context, R.style.countries_dialog);
                this.context = context;
                this.countries = countries;

        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                listView = new ListView(context);
                listView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
                listView.setId(android.R.id.list);

                adapter = new CountriesAdapter(context, countries);
                listView.setAdapter(adapter);
                listView.setOnItemClickListener(adapter);
                listView.setVerticalFadingEdgeEnabled(false);
               
                setInverseBackgroundForced(true);
                setView(listView);
                setTitle("Select country");

                super.onCreate(savedInstanceState);
        }

}

Adapter:
Codice (Java): [Seleziona]
public class CountriesAdapter extends ArrayAdapter<String> implements OnItemClickListener {

        private Vector<String> countries;
        private Context context;

        public CountriesAdapter(Context context, Vector<String> countries) {
                super(context, R.layout.countries, countries);
                this.context = context;
                this.countries = countries;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View rowView = inflater.inflate(R.layout.countries_row, parent, false);
                ImageView imageView = (ImageView) rowView.findViewById(R.id.countries_list_single_image);
                TextView textView = (TextView) rowView.findViewById(R.id.countries_list_single_text);
                textView.setText(countries.get(position));

                DatabaseManager db = new DatabaseManager(context);
                db.connectForReading();
                String recource = db.getFLagName(countries.get(position));
                db.disconnect();

                int resId = context.getResources().getIdentifier(recource, "drawable", "com.emaborsa");
                imageView.setImageDrawable(context.getResources().getDrawable(resId));
                return rowView;
        }

        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                Log.e("ewrere", "dfgdhbh gd");

        }

}

Il tutto funziona, l'unico problema che il contorno del Dialog non è trasparente, non riesco a fare i bordi smussati, gli item non sono cliccabili...insomma, non sono molto contento del risultato.
Chi mi sa dare delle dritte?
Sotto uno screen del lavoro


Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creazione di un Dialog con una lista variabile
« Risposta #1 il: 14 Luglio 2012, 10:46:22 CEST »
0
Ciao,
vedo che n on usi il riutilizzo delle View e vai a fare la query dentro il metodo getView, non mi sembra molto efficiente. Immagino che lo scroll della lista sia piuttosto scattosa... sbaglio?

Io comunque avrei proceduto con le classi standard, senza implementarmi il mio custom AlertDialog poichè la classe AlertDialog.Builder ha un suo metodo setAdapter che ti permette di mostrare una lista di elementi a partire da quell'adapter che gli passi (effettivamente potrebbero mettere un esempio dentro Dialogs | Android Developers )
Nel tuo caso sarebbe bastato utilizzare un SimpleCursorAdapter (con un ViewBinder per mostrare anche la bandiera) oppure un CursorAdapter   (andando quindi a implementare tu il metodo newView e bindView).

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:Creazione di un Dialog con una lista variabile
« Risposta #2 il: 14 Luglio 2012, 13:31:07 CEST »
0
Ciao, in effetti avevo visto il setAdapter(), e anche adesso potre evitare l'estensione del Dialog...ma così almeno ho l'activity più pulita e non ho nessun problema. L'adapter avrei dovuto comunque estenderlo, per customizzare la singola riga.
Come ogni volta, mi fa impazzire il come passargli la lista.xml. Ieri sono rimasto a lavorarci fino alle 3 di notte e alla fine ci sono riuscito, a farla come volevo, ho le ombreggiature sia sopra che sotto, senza bordi strani. Sono anche riuscito a customizzare il titolo e il suo sfondo.
Il fatto delle View non riutilizzate è stata solo una svista, ora l'ho sistemato...ma comunque la lista non mi sembrava scattosa, a parte all'inizio dello scroll.
L'unica cosa che vorrei ancora fare, è avere i bordi del dialogo smussati...ma non ci reisco.
Ti mostro il risultato:


Differenze:
- activity in back visibile
- custom TiteView
- ombreggiature OK.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Creazione di un Dialog con una lista variabile
« Risposta #3 il: 14 Luglio 2012, 15:24:03 CEST »
0
L'aspetto dipende dal tema, tu imposti un tema personalizzato "R.style.countries_dialog", controlla cosa imposti o utilizza il tema di default dei dialoghi.

Apri il database ad ogni richiesta, non è il massimo per la velocità e consumo memoria. Android con API 11 ha introdotto delle ottimizzazioni per il load in background dei dati attraverso il LoaderManager e CursorLoader. Se non si puoi utilizzare API 11 Google ha implementato queste classi e altre nella Android Support Library.

adb logcat | tee /tmp/logcat | grep TAG

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:Creazione di un Dialog con una lista variabile
« Risposta #4 il: 14 Luglio 2012, 16:28:23 CEST »
0
L'aspetto dipende dal tema, tu imposti un tema personalizzato "R.style.countries_dialog", controlla cosa imposti o utilizza il tema di default dei dialoghi.

Apri il database ad ogni richiesta, non è il massimo per la velocità e consumo memoria. Android con API 11 ha introdotto delle ottimizzazioni per il load in background dei dati attraverso il LoaderManager e CursorLoader. Se non si puoi utilizzare API 11 Google ha implementato queste classi e altre nella Android Support Library.

Il fatto del database lo so devo ottimizzarlo, ma il discorso ottimizzazione può aspettare. Intanto volevo fare la parte grafica in modo putilo, poi posso sempre lavorare sulla logica.

Il fatto degli angoli smussati sono fermo, non somo molto pratico di temi e stili.

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:Creazione di un Dialog con una lista variabile
« Risposta #5 il: 18 Luglio 2012, 08:45:57 CEST »
0
Ho provato a cambiare il codice, senza fare un chiamata al db per elemento della lista, ma il risultato non cambia. Ho provato anche a evitare il findViewById() per ogni elemento, tenendo il tutto in memoria, ma nemmeno qui cambia.
L'apertura della lista resta sempre un pò ritardata....