Autore Topic: Inserire in una listView immagini presenti in sd, prelevate tramite uri  (Letto 2263 volte)

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Salve ragazzi.
Io vorrei inserire in una listview delle immagini presenti in sd, di cui richiamo l'uri salvata in un database sqlite che mi faccio restituire tramite una sql sul db stesso.

Questo è l'xml di un prodotto della listview:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal"
        android:weightSum="10"
        >

        <ImageView android:layout_width="50dip" android:layout_height="50dip" android:id="@+id/ImageView02"></ImageView>

<TextView              
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:textSize="15dp"
                android:textStyle="bold"
                android:textColor="#000000" android:layout_weight="2" android:id="@+id/Idar">
        </TextView>
       
        <TextView android:layout_height="wrap_content" android:textSize="15dp" android:textStyle="bold" android:textColor="#000000" android:layout_weight="6" android:layout_width="wrap_content" android:id="@+id/Nomear">
        </TextView>
       
<TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_weight="3" android:id="@+id/Uriar" android:textColor="#000000" android:textSize="15dp" android:textStyle="bold"></TextView>


</LinearLayout>


Ovviamente io ho una serie di oggetti che mi ritornano da una query del tipo SELECT * FROM products
La query mi restituisce un po di campi e anche l'uri dell'immagine relativa ad ogni articolo salvata sulla sd.

Il tutto per ovvia comodità lo gestico con i Cursor nel seguente modo:
Codice (Java): [Seleziona]
Cursor c=db2.fetchProducts();
        startManagingCursor(c);

   
       
        SimpleCursorAdapter adapter=new SimpleCursorAdapter( //semplice adapter per i cursor
                        this,
                        R.layout.product, //il layout di ogni riga/prodotto
                        c,
                        new String[]{MyDatabase.ProductsMetaData.PRODUCT_IDAR_KEY,MyDatabase.ProductsMetaData.PRODUCT_NOMEAR_KEY,MyDatabase.ProductsMetaData.PRODUCT_URIAR_KEY},//questi colonne
                        new int[]{R.id.Idar,R.id.Nomear,R.id.Uriar});//in queste views
     
       
        productsLv.setAdapter(adapter); //la listview ha questo adapter

dove fetchproducts() è il metodo che contiene la query sopra riportata.

Per trasformare  l'immagine da jpg a bmp in modo da renderla associabile ad una imageview uso:
Codice (Java): [Seleziona]
String myJpgPath = "/mnt/sdcard/frova.jpg";
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 5;
Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);

Poi per associare una sola immagine alla imageview faccio:
Codice (Java): [Seleziona]
 ImageView image=(ImageView)findViewById(R.id.ImageView01);
image.setImageBitmap(bm);

Quello che vorrei fare io è iterare tutto questo all'interno del cursor sopra riportato facendo comparire per ogni articolo della lista la relativa immagine.
Non riesco a fare l'associazione tra l'uri dell'immagine e la imageview all'interno del cursor.

Thanks at all.
« Ultima modifica: 30 Ottobre 2010, 15:02:06 CEST da Sangio85 »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #1 il: 30 Ottobre 2010, 15:06:16 CEST »
0
Ti conviene andare ad estendere il SimpleCursorAdapter e andare ad implementare il netodo newView e bindView in modo da avere accesso completo alla view che compongono le tue righe. Trvo un sacco di tutorial online.

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #2 il: 30 Ottobre 2010, 15:12:29 CEST »
0
Riesci ad indicarmene per piacere un paio che fanno testo al mio caso?
Grazie Richy!  O:-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #4 il: 30 Ottobre 2010, 16:54:35 CEST »
0
Dai tutorial mi trovo un po spiazzato...se c'è qualcuno che riesce a darmi un input con due righe di codice da cui partire ne sarei molto grato...grazie 1000 a tutti.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #5 il: 30 Ottobre 2010, 17:28:58 CEST »
0
Mi sembra che il codice che c'è nella seconda risposta del link precedente sia piuttosto comprensibile. No?
Nel metodo newView fai l'inflate della view che devi usare come layout della riga
Nel metodo bindView alle view che stanno nella view "riga" assegni i valori.

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #6 il: 30 Ottobre 2010, 18:06:06 CEST »
0
Qualcosa inzio a capire...per ora sto facendo:

Codice (Java): [Seleziona]
 class MyAdapter(Context context, Cursor c) {
            super(context, R.layout.product, c);
        }

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

       
        public void bindView(View view, Context context, Cursor c) {
               
            ListView Produtc = (ListView)view.findViewById(R.id.productsLv);
            Product.setText(cur.getString(cur.getColumnIndex(db2.DB_NAME)));
         
        }

Ora nel bind a Product al posto che db2.DB_NAME dovrei passargli i valori della riga cioè l'immagine, il nome articolo (ovviamente facendo riferimento alle relative colonne nel db)??

Inoltre non capisco a cosa serva il context
« Ultima modifica: 30 Ottobre 2010, 18:14:04 CEST da Sangio85 »

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #7 il: 30 Ottobre 2010, 18:35:11 CEST »
0
Scusami Ricky...piano piano sto iniziando a capire...è un mesetto che mi sto dedicando ad android ed alcune cose sono per me completamente nuove e ho un po di difficoltà ad apprenderle subito...

Allora mi sono creato un nuovo file MyActivity.java contenente il seguente codice:
Codice (Java): [Seleziona]
public class MyActivity extends ListActivity {

    MyAdapter mListAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Cursor myCur = null;

        myCur = db2.fetchProducts();

        mListAdapter = new MyAdapter(MyActivity.this, myCur);
        setListAdapter(mListAdapter);
    }


   
    private class MyAdapter extends ResourceCursorAdapter {
   
        public MyAdapter(Context context, Cursor cur) {
            super(context, R.layout.product, cur);
        }

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

       
        public void bindView(View view, Context context, Cursor cur) {
            ListView tvListText = (ListView)view.findViewById(R.id.productsLv);
           

            tvListText.setText(cur.getString(cur.getColumnIndex(Datenbank.DB_NAME)));
           
        }
    }
}


Ora quello che devo andare a modificare è la parte nel bindView dove dovrei andare a mettere il contenuto della mia riga della listview, cioè io vorrei vedere l'immagine da uri su sd e il resto delle info che già vedevo con il mio cursoradapter che mi ero creato in precedenza..
Inoltre gli sto passando al cursor myCur la query solo che non vi vede il mio database db2 che ovviamente è dichiarato nel file Demo.java...sono sulla strada giusta?

« Ultima modifica: 30 Ottobre 2010, 18:52:27 CEST da Sangio85 »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #8 il: 30 Ottobre 2010, 20:17:46 CEST »
0
Ti ho modificato il tutorial di qlimax e ho implementato questo tipo di adapter. Spero sia chiaro.

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #9 il: 30 Ottobre 2010, 23:32:38 CEST »
0
Ti ringrazio Ricky!! Ora ho decisamente capito meglio il tutto...funziona...e provo a far inserire le immagini prese da sd tramite uri...grazie ancora per la tua disponibilità e per l'infinita pazienza...

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #10 il: 31 Ottobre 2010, 00:18:21 CEST »
0
...rompo ancora...sto cercando come inserire ora in ogni riga della listview la relativa immagine del prodotto...
ho un problemino con il settaggio della bitmap..
quello che faccio è:

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

       private int      mNameIndex;
                private int     mPriceIndex;
                private int mUriIndex;
       
                public Bitmap getBitmap(String myJpgPath)
                   {
                       BitmapFactory.Options options = new BitmapFactory.Options();
                       options.inSampleSize = 5;
                       Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
                           return bm;
                   }

                public MyAdapter(Context context, Cursor cur) {
           super(context, R.layout.product, cur);
           
           mNameIndex = cur.getColumnIndex( MyDatabase.ProductsMetaData.PRODUCT_IDAR_KEY );
           mPriceIndex = cur.getColumnIndex( MyDatabase.ProductsMetaData.PRODUCT_NOMEAR_KEY);
           mUriIndex = cur.getColumnIndex( MyDatabase.ProductsMetaData.PRODUCT_URIAR_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 idAr = ( TextView ) view.findViewById( R.id.Idar );
                        TextView nameAr = ( TextView ) view.findViewById( R.id.Nomear );
                        TextView uriAr = ( TextView ) view.findViewById( R.id.Qtaar );
                        ImageView imageAr = (ImageView) view.findViewById(R.id.ImageArticolo);
                       
                        idAr.setText( cur.getString( mNameIndex ) );
                        nameAr.setText( cur.getString( mPriceIndex ) );
                        uriAr.setText( cur.getString( mUriIndex ) );
                        Bitmap b = null;
                        imageAr.setImageBitmap(b.getBitmap(cur.getString(mUriIndex)));
       }

   }

solo che mi da un errore sul b.getBitmap(cur.getString(mUriIndex)) e non capisco perchè in quanto il metodo mi restituisce la bitmap creata dal metodo getBitmap che ho implementato dicendomi che al setImageBitmap gli passo una stringa quando io vorrei passargli la bitmap creata dalla uri corrispondente all'immagine...
« Ultima modifica: 31 Ottobre 2010, 00:20:55 CEST da Sangio85 »

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #11 il: 31 Ottobre 2010, 00:29:49 CEST »
0
Risolto con:

imageAr.setImageURI(Uri.parse(cur.getString( mUriIndex )));

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Inserire in una listView immagini presenti in sd, prelevate tramite uri
« Risposta #12 il: 31 Ottobre 2010, 09:57:32 CET »
0
Bene, se hai risolto contrassegna il topic come "risolto".