Autore Topic: AlertDialog popolato con valori presi da database al click su listview  (Letto 1054 volte)

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Ciao ragazzi. Ho un problema nella creazione di un dialog nel quale vorrei inserire (al click su elementi della listview popolata con elementi presi da database) il nome e l'immagine dell'elemento della listview cliccato.

Quello che sono riuscito per ora a fare è un semplice alertdialog dove visualizzo un'immagine in modo statico. Quello che vorrei fare io è che al click sull'elemento della listview mi appaia un dialog con l'immagine relativa all'elemento cliccato e il nome relativo all'elemento cliccato.
Queste due info sono inserite nella listview da database.

Questo è il codice del mio alertdialog:

Codice (Java): [Seleziona]
AdapterView.OnItemClickListener mItemListener = new OnItemClickListener() {
               
                   public void onItemClick(AdapterView parent,View v,int pos,long id) {
                                         
                       AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                       ImageView image = new ImageView(activity);  
                   
                     
                       String myJpgPath = "/mnt/sdcard/frova.jpg";
                       BitmapFactory.Options options = new BitmapFactory.Options();
                       options.inSampleSize = 1;           
                       Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
                       image.setImageBitmap(bm);
                       builder.setTitle("Conferma Acquisto");
                       builder.setView(image);
                         builder.setMessage("Vuoi acquistare una confezione di").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                             
                           public void onClick(DialogInterface dialog, int id) {
                                  dialog.cancel();  
                              }
                          });
                   builder.create().show();
                   }
                };    
                ((ListView)findViewById(R.id.productsLv)).setOnItemClickListener(mItemListener);


Mentre per recuperare i dati da database uso i cursor e gli adapter per andare poi a crearmi la mia listview.

Codice (Java): [Seleziona]
// query che ci restituisce tutti i prodotti in lista e li passa ad un Cursor
        Cursor c=db2.fetchProducts2();
        startManagingCursor(c);
        MyAdapter adapter = new MyAdapter(this, c);
        productsLv.setAdapter(adapter); //la listview ha questo adapter

e questa è la classe MyApapter

Codice (Java): [Seleziona]
 class MyAdapter extends ResourceCursorAdapter {

                private int     mNameIndex;
                private int mUriIndex;
                private int mQtaIndex;
                       
                public MyAdapter(Context context, Cursor cur) {
           super(context, R.layout.product, cur);
           
           mNameIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
           mUriIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
           mQtaIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
       }

       @Override
                public View newView ( Context context, Cursor cursor, ViewGroup parent ) {
           LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           return li.inflate(R.layout.product, parent, false);
                }

                @Override
       public void bindView(View view, Context context, Cursor cur) {
               
                        TextView nameAr = ( TextView ) view.findViewById( R.id.Nomear );
                        TextView qtaAr = ( TextView ) view.findViewById( R.id.Qtaar );
                        ImageView imageAr = (ImageView) view.findViewById(R.id.ImageArticolo);
               
                        nameAr.setText( cur.getString( mNameIndex ) );
                        qtaAr.setText( cur.getString( mQtaIndex ) );
                        imageAr.setImageURI(Uri.parse(cur.getString( mUriIndex )));

       }
   }

Quello che non riesco a capire è come poter richiamare l'uri e il nomearticolo presenti nel database, (oppure credo si possa fare prendendo queste due info direttamente dall'elemento della listview creato) all'interno dell'alertdialog.
Spero di essermi spiegato bene.
Vi ringrazio.
Ciao.

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:AlertDialog popolato con valori presi da database al click su listview
« Risposta #1 il: 05 Novembre 2010, 15:14:16 CET »
0
Sto impazzendo...non riesco proprio ad adattare gli onclick sugli elementi della mia lista...nessuno riesce a darmi una mano??
grazie 100000000

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:AlertDialog popolato con valori presi da database al click su listview
« Risposta #2 il: 05 Novembre 2010, 15:50:15 CET »
0
se istanzi la classe che gestisce il DB all'onCreate dell'activity e la dichiara come final, può essere referenziata all'interno del listener, per cui puoi prenderti i dati, visto che hai accesso al db.

Codice (Java): [Seleziona]
                final int pippo = 0;
               
                list.setOnItemClickListener(new OnItemClickListener() {

                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                               
                               int b = pippo;     //HO ACCESSO ALLA VARIABILE PIPPO
                        }
                }

Spero di essermi spiegato.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:AlertDialog popolato con valori presi da database al click su listview
« Risposta #3 il: 05 Novembre 2010, 16:03:21 CET »
0
Ok...ti ringrazio....
ci avevo proavato solo che mi dava problemi e crashava l'applicazione...ora non crasha più...
ti faccio sapere se riesco nel mio intento di visulizzare un alert dialog con la visualizzazione degli elementi corretti presi da database all'onclick dell'elemento su listview...

Quello che ho fatto è la seguente cosa:

Codice (Java): [Seleziona]
final MyDatabase2 db2=new MyDatabase2(getApplicationContext());
....
....


AdapterView.OnItemClickListener mItemListener = new OnItemClickListener() {
               
                       
               
                   public void onItemClick(AdapterView<?> adapter, View v,int pos,long id) {
       

                       db2.open();
                           Cursor e = db2.fetchProducts(); //query che mi restituisce tutti i prodotti della
//tabella prodotti...ed ora dovrei riuscire a maneggiare i dati presenti nel database
// grazie al cursor e a visualizzarli nell'alertdialog....
 

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:AlertDialog popolato con valori presi da database al click su listview
« Risposta #4 il: 05 Novembre 2010, 16:19:42 CET »
0
ok.
fammi sapere.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:AlertDialog popolato con valori presi da database al click su listview
« Risposta #5 il: 05 Novembre 2010, 16:25:13 CET »
0
Ma dichiarando il mio database db2 come final poi lo posso modificare?
Io gestendo l'onclick, quando do l'ok nell'alertdialog decrementerei la quantità del prodotto selezionato all'interno del database...
grazie mille...

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:AlertDialog popolato con valori presi da database al click su listview
« Risposta #6 il: 05 Novembre 2010, 16:37:29 CET »
0
Così son riuscito nel mio intento e funziona alla perfezione...ora mi rimane il dubbio del fatto che possa modificare il mio database db2 essendo dichiarato final....

Codice (Java): [Seleziona]
AdapterView.OnItemClickListener mItemListener = new OnItemClickListener() {
               
                       
               
                   public void onItemClick(AdapterView<?> adapter, View v,int pos,long id) {
                           
                           String st = "Clicked POS="+pos+" ID="+id;
                       Toast.makeText(getApplicationContext(),st,Toast.LENGTH_SHORT).show();
                           
                       db2.open();
                           Cursor r = db2.fetchProducts2();
                           startManagingCursor(r);
                           r.moveToPosition(pos);
                           
                           int mNameIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
                           int mUriIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
                                   
                                         
                                     
               
                       ImageView image = new ImageView(activity);  
                       AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                     
                       String s = r.getString(mUriIndex).substring(8);
                       s=s.replaceAll("%20", " ");
                       String myJpgPath = s;
                       BitmapFactory.Options options = new BitmapFactory.Options();
                       options.inSampleSize = 1;           
                       Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
                       image.setImageBitmap(bm); //Sostituisci la tua bitmap
                       builder.setTitle("Conferma Acquisto");
                       builder.setView(image);
                           
                       builder.setMessage("Vuoi acquistare una confezione di "+r.getString(mNameIndex)+"?").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                             
                           public void onClick(DialogInterface dialog, int id) {
                                  dialog.cancel();  
                             
                              }
                          });
                   builder.create().show();
                   db2.close();
                   }
                };    
                ((ListView)findViewById(R.id.productsLv)).setOnItemClickListener(mItemListener);

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:AlertDialog popolato con valori presi da database al click su listview
« Risposta #7 il: 05 Novembre 2010, 17:13:24 CET »
0
beh.

Dovresti utilizzare l'incapsulamento, per cui dei utlizzi setter per poter compiere operazioni sulla tua classe.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AlertDialog popolato con valori presi da database al click su listview
« Risposta #8 il: 05 Novembre 2010, 19:42:48 CET »
0
Così son riuscito nel mio intento e funziona alla perfezione...ora mi rimane il dubbio del fatto che possa modificare il mio database db2 essendo dichiarato final....

Un attributo final non ti permette di assegnare al tuo oggetto un nuovo indirizzo di memoria (ovvero fare una nuova new) ma ti permette di fare tutte le altre operazioni. Che senso ha fare una nuova new di una classe che ti rappresenta il db?  Di solito si utilizza il pattern Singleton percui non si fa mai la new :P