Autore Topic: leggere immagini provenienti da database mysql in una listview  (Letto 1136 volte)

Offline mrfalco

  • Utente junior
  • **
  • Post: 81
  • Respect: +2
    • Mostra profilo
    • www.falcodomingo.it
  • Dispositivo Android:
    Samsung Galazy S
  • Sistema operativo:
    Windows Vista
0
Dopo circa una settimana di sacrificio sono riuscito a risolvere un problema che mi assillava come ho scritto in oggetto.

Seguite questi passi e avrete un bel risutato:

- Create un db mysql ed una tabella pippo con campo blob immagine,descrizione text.
- Create un pagina php
- codice java
- layout xml per le row_item.

qui di seguito vi elenco il tutto:

codice per pagina php da inserire nel vs apache in www:

Codice (PHP): [Seleziona]
<?php
         mysql_connect("localhost","root","pwd");
         mysql_select_db("nomedb");
         $miavar="[";
       
        $query=mysql_query("SELECT descrizione,immagine FROM tabella_pippo ");

        while ($row=mysql_fetch_assoc($query)) {
                        $array=$row;
           
                        $array['immagine']=base64_encode($row['immagine']);
           
            $miaimg=base64_encode($row['immagine']);
            $miavar=$miavar . "{" . '"' . "descrizione" . '"' . ":" . '"' . $row[descrizione] . '"' . "," .
                            '"' . "immagine" . '"' . ":" . '"' . $miaimg . '"' . "}," ;

           $output[]=$array;
        }
        $miavar=substr($miavar,0,strlen($miavar)-1);
        $miavar=$miavar . "]";

         print ($miavar);
 
        mysql_close();
?>
come potete notare non ho usato json ma una concatenazione di stringhe.

ora vediamo il layout:

Codice (XML): [Seleziona]
<RelativeLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="60dip"
       android:padding="5dip">
        <TextView
               android:text="descrizione"
               android:layout_marginLeft="5dip"
               android:textAppearance="?android:attr/textAppearanceLarge"
               android:id="@+id/descrizione"
               android:textColor="#6b71f1"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content">
        </TextView>
        <ImageView
                 android:id="@+id/immagine"
               android:layout_width="40px"
               android:layout_height="40px"
               android:layout_alignParentRight="true">
        </ImageView>    
       
</RelativeLayout>


ed infine il codice java:

Codice (Java): [Seleziona]
 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        String result = "";
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("mostra","S"));
        InputStream is=null;
        //http post
        try{
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://192.168.0.2/pippo.php");
                //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
        }catch(Exception e){
                Log.e("log_tag", "Error in http connection "+e.toString());
        }
        //convert response to string
        try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                }
                is.close();
         
                result=sb.toString();
        }catch(Exception e){
                Log.e("log_tag1", "Error converting result "+e.toString());
        }
         
        //parse json data
        ListView mView;
        ArrayList<HashMap<String, String>> lista = new ArrayList<HashMap<String, String>>();    
        mView = (ListView) findViewById(R.id.listView1);
        String[] nome={"descrizione","immagine"};
        int[] reso={R.id.descrizione,R.id.immagine};
        try{
                JSONArray jArray = new JSONArray(result);
                for(int i=0;i<jArray.length();i++){
                        JSONObject json_data = jArray.getJSONObject(i);
                        HashMap<String,String> data = new HashMap<String,String> ();
                                    data.put("descr",json_data.getString("descrizione"));
                                    String s=json_data.getString("immagine");
                                    data.put("immagine",s);                                
                                    lista.add(data);
                }
                SimpleAdapter sp=new SimpleAdapter(this, lista,R.layout.categ_item , nome, reso) {
               
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                       

                        if (convertView==null){
                                   LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                           convertView=inflater.inflate(R.layout.categ_item, null);
                         }
                       
                         Object r=getItem(position);
                         HashMap <String, Object> r1=new HashMap<String,Object>();
                         r1.put("immagine", getItem(0));
                         r1.put("descr", getItem(1));
                         View row = super.getView(position, convertView, parent);
                         String[]Splitta=r.toString().split(",");
                         String Splitta2=Splitta[0];
                         String[] Splitta3=Splitta2.split("=");
                       
                         if (Splitta3.length>1){
                                 String col=Splitta3[1];
                         ImageView icon=(ImageView)row.findViewById(R.id.immagine);
                             byte []b=Base64.decode(col, 0);
                             ByteArrayInputStream ins =new ByteArrayInputStream(b);
                             Bitmap bm=BitmapFactory.decodeStream(ins);
                         icon.setImageBitmap(bm);
                         }
                         return row;
               
                }
                };
               
                mView.setAdapter(sp);
               
        }catch(JSONException e){
                Log.e("log_tag2", "Error parsing data "+e.toString());
        }
    }
   
   
In parole povere se si usa il simpleadapter per fare il bind di un listview bisogna se si vuole caricare immagine esterne di qualunque formato effettuare l'ovveride del metodo getview(perchè simple adapter si aspetta  int[] come risorsa) poichè solo cosi sarà possibile effettuare il cast della ImageView e quindi dirgli che icon.setImageBitmap(bm).

Spero di essere stato chiaro.

un saluto e un grazie a 7h38ugg3r  per il suo aiuto in questi giorni.

Offline sirtraco

  • Utente junior
  • **
  • Post: 92
  • Respect: 0
    • Mostra profilo
Re:leggere immagini provenienti da database mysql in una listview
« Risposta #1 il: 29 Maggio 2012, 15:38:49 CEST »
0
Dopo circa una settimana di sacrificio sono riuscito a risolvere un problema che mi assillava come ho scritto in oggetto.

Seguite questi passi e avrete un bel risutato:

- Create un db mysql ed una tabella pippo con campo blob immagine,descrizione text.
- Create un pagina php
- codice java
- layout xml per le row_item.

qui di seguito vi elenco il tutto:

codice per pagina php da inserire nel vs apache in www:

Codice (PHP): [Seleziona]
<?php
         mysql_connect("localhost","root","pwd");
         mysql_select_db("nomedb");
         $miavar="[";
       
        $query=mysql_query("SELECT descrizione,immagine FROM tabella_pippo ");

        while ($row=mysql_fetch_assoc($query)) {
                        $array=$row;
           
                        $array['immagine']=base64_encode($row['immagine']);
           
            $miaimg=base64_encode($row['immagine']);
            $miavar=$miavar . "{" . '"' . "descrizione" . '"' . ":" . '"' . $row[descrizione] . '"' . "," .
                            '"' . "immagine" . '"' . ":" . '"' . $miaimg . '"' . "}," ;

           $output[]=$array;
        }
        $miavar=substr($miavar,0,strlen($miavar)-1);
        $miavar=$miavar . "]";

         print ($miavar);
 
        mysql_close();
?>
come potete notare non ho usato json ma una concatenazione di stringhe.

ora vediamo il layout:

Codice (XML): [Seleziona]
<RelativeLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="60dip"
       android:padding="5dip">
        <TextView
               android:text="descrizione"
               android:layout_marginLeft="5dip"
               android:textAppearance="?android:attr/textAppearanceLarge"
               android:id="@+id/descrizione"
               android:textColor="#6b71f1"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content">
        </TextView>
        <ImageView
                 android:id="@+id/immagine"
               android:layout_width="40px"
               android:layout_height="40px"
               android:layout_alignParentRight="true">
        </ImageView>    
       
</RelativeLayout>


ed infine il codice java:

Codice (Java): [Seleziona]
 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        String result = "";
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("mostra","S"));
        InputStream is=null;
        //http post
        try{
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://192.168.0.2/pippo.php");
                //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
        }catch(Exception e){
                Log.e("log_tag", "Error in http connection "+e.toString());
        }
        //convert response to string
        try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                }
                is.close();
         
                result=sb.toString();
        }catch(Exception e){
                Log.e("log_tag1", "Error converting result "+e.toString());
        }
         
        //parse json data
        ListView mView;
        ArrayList<HashMap<String, String>> lista = new ArrayList<HashMap<String, String>>();    
        mView = (ListView) findViewById(R.id.listView1);
        String[] nome={"descrizione","immagine"};
        int[] reso={R.id.descrizione,R.id.immagine};
        try{
                JSONArray jArray = new JSONArray(result);
                for(int i=0;i<jArray.length();i++){
                        JSONObject json_data = jArray.getJSONObject(i);
                        HashMap<String,String> data = new HashMap<String,String> ();
                                    data.put("descr",json_data.getString("descrizione"));
                                    String s=json_data.getString("immagine");
                                    data.put("immagine",s);                                
                                    lista.add(data);
                }
                SimpleAdapter sp=new SimpleAdapter(this, lista,R.layout.categ_item , nome, reso) {
               
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                       

                        if (convertView==null){
                                   LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                           convertView=inflater.inflate(R.layout.categ_item, null);
                         }
                       
                         Object r=getItem(position);
                         HashMap <String, Object> r1=new HashMap<String,Object>();
                         r1.put("immagine", getItem(0));
                         r1.put("descr", getItem(1));
                         View row = super.getView(position, convertView, parent);
                         String[]Splitta=r.toString().split(",");
                         String Splitta2=Splitta[0];
                         String[] Splitta3=Splitta2.split("=");
                       
                         if (Splitta3.length>1){
                                 String col=Splitta3[1];
                         ImageView icon=(ImageView)row.findViewById(R.id.immagine);
                             byte []b=Base64.decode(col, 0);
                             ByteArrayInputStream ins =new ByteArrayInputStream(b);
                             Bitmap bm=BitmapFactory.decodeStream(ins);
                         icon.setImageBitmap(bm);
                         }
                         return row;
               
                }
                };
               
                mView.setAdapter(sp);
               
        }catch(JSONException e){
                Log.e("log_tag2", "Error parsing data "+e.toString());
        }
    }
   
   
In parole povere se si usa il simpleadapter per fare il bind di un listview bisogna se si vuole caricare immagine esterne di qualunque formato effettuare l'ovveride del metodo getview(perchè simple adapter si aspetta  int[] come risorsa) poichè solo cosi sarà possibile effettuare il cast della ImageView e quindi dirgli che icon.setImageBitmap(bm).

Spero di essere stato chiaro.

un saluto e un grazie a 7h38ugg3r  per il suo aiuto in questi giorni.
ciao, ho preso il tuo tutoria, ma mi da degli errori sul codice java, precisamente non mi riconosce il parametro ViewGroup parent, sul metodo public View getView, poi non mi trova i vari collegamenti R.layout.