2015-10-18 12 views
5

Goalimmagine di default Display in imageview se nessuna immagine restituita dal server

visualizzare un'immagine predefinita quando nessuna immagine viene scaricata dal server.

Problema

Ho un ListView con imageview (con un paio di testo, ma quello non è importante). La mia visualizzazione di immagini scarica le immagini per gli studenti ma quando lo studente non ha un'immagine, sto cercando di visualizzare un'immagine predefinita. Ho provato due cose che pensavo dovessero funzionare, impostare un'immagine predefinita o il codice seguente. Questo codice è tratto da un file di attività in cui scrivo i valori dalle colonne del database a variabili (solo mostrava img per mantenere la semplicità)

    //Image path returned 
        if (javaRealObject.getString("img").equals("")) 
        { 
         imgv = (ImageView)findViewById(R.id.ivImage); 
         imgv.setImageResource(R.drawable.emptyhead); 

         Log.d("Test", "Empty"); 
        } 
        else//No image found in column 
        { 
         student.setImage(javaRealObject.getString("img")); 
         Log.d("Test","Not Empty"); 
        } 

Comunque io sono sempre un riferimento e nulla su imgv = (ImageView)findViewById(R.id.ivImage); e io non sono sicuro perché poiché la mia vista immagine è stata dichiarata. Qualsiasi aiuto per l'effetto di un'immagine predefinita quando nessuno è fornito dalla colonna sarà apprezzato.

Per un po 'più di contesto, il codice sopra è un'attività che chiama listview.xml, che quindi chiama row.xml. la visualizzazione di immagini in questione è nel file row.xml.

ROW.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="4dp" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <ImageView 
      android:id="@+id/ivImage" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="8dp" 
      android:src="@drawable/empty_head" /> //default image here 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" > 

      <TextView 
       android:id="@+id/tvFirstName" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textColor="@color/primary" 
       android:textAppearance="?android:attr/textAppearanceLarge" /> 
      </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

List che chiama fila

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ListView 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="450dp" 
     tools:listitem="@layout/row" > 
    </ListView> 
</LinearLayout> 

Adapter:

public class DriverAdapter extends ArrayAdapter<Drivers> { 

    ArrayList<Drivers> ArrayListDrivers; 
    int Resource; 
    Context context; 
    LayoutInflater vi; 

    public DriverAdapter(Context context, int resource, ArrayList<Drivers> objects) { 
     super(context, resource, objects); 

     ArrayListDrivers = objects; 
     Resource = resource; 
     this.context = context; 

     vi = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

     ViewHolder holder; 
     if (convertView == null) { 
      convertView = vi.inflate(Resource, null); 
      holder = new ViewHolder(); 

      holder.imageview = (ImageView) convertView.findViewById(R.id.ivImage); 
      holder.tvName = (TextView) convertView.findViewById(R.id.tvFirstName); 
      holder.tvDescription = (TextView) convertView.findViewById(R.id.tvLastName); 
      holder.tvClientid = (TextView) convertView.findViewById(R.id.tvid); 
      holder.tvExpires = (TextView) convertView.findViewById(R.id.tv_expdate); 

      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.imageview.setImageResource(R.drawable.ic_launcher); 
      new DownloadImageTask(holder.imageview).execute(ArrayListDrivers.get(position).getImage()); 


     Glide.with(holder.imageview.getContext()) 
       .load(new DownloadImageTask(holder.imageview).execute(ArrayListDrivers.get(position).getImage())  ) 
       .centerCrop() 
       .placeholder(R.drawable.ic_launcher) 
       .crossFade() 
       .into(holder.imageview); 


     holder.tvName.setText(ArrayListDrivers.get(position).getFirstname()); 
     holder.tvDescription.setText(ArrayListDrivers.get(position).getLastname()); 
     holder.tvClientid.setText(ArrayListDrivers.get(position).getClient_id()); 
     holder.tvExpires.setText("Expiry Date:"+ArrayListDrivers.get(position).getExpires()); 



     return convertView; 


    } 

    static class ViewHolder { 
     public ImageView imageview; 
     public TextView tvName; 
     public TextView tvDescription; 
     public TextView tvClientid; 
     public TextView tvExpires; 

    } 


    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

     public DownloadImageTask(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap cImg1 = null; 


      try { 

       byte[] decodedString = Base64.decode(urldisplay, Base64.DEFAULT); 
       cImg1 = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 


      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return cImg1; 


     } 

     protected void onPostExecute(Bitmap result) { 

      bmImage.setImageBitmap(result); 


     } 
    } 
} 
+0

per favore pubblica il tuo codice XML. –

+0

è sopra il codice dalla classe dell'adattatore ..? –

+0

Pubblica il file xml e il registro. Ancora una cosa devi dichiarare la riga findViewbyId sopra se esiste la condizione. – Pankaj

risposta

1

Questo metodo avrebbe funzionato - impostare un'immagine predefinita nel codice XML , che verrà visualizzato quando lo studente ha no Immagine. Imposta dinamicamente l'immagine usando setImageResource (...) se hai un'immagine.

Ricontrolla l'ID di ImageView quando ricevi un errore di riferimento null e se questo non risolve il problema, inserisci il codice di attività completo.

+0

Sì, riceverai un errore di riferimento null in quanto la tua attività non ha idea del tuo file row.xml, puoi solo chiamare le viste nel listview contenente xml. È possibile accedere a tale vista immagine solo dove si imposta tale riga nella lista come nella classe adattatore –

+0

Sto facendo esattamente quello nel mio adattatore (lo ho incollato sopra) tuttavia le immagini di default non sono mostrate. Credo che sia perché lo assegna "nothnig" in quanto non ottiene nulla dal percorso dell'immagine nella query. – Niana

13

C'è un modo migliore per farlo, è possibile utilizzare una delle librerie di caricamento delle immagini come:

Glide.

Un'immagine di carico e la biblioteca di caching per Android focalizzata sulla scorrimento continuo

e vi porterà solo una riga per fare quello che vuoi.

Glide.with(myFragment) 
    .load(url) 
    .placeholder(R.drawable.loading_spinner) 
    .into(myImageView); 

è più facile e pulito.

+0

Mi piacerebbe davvero usarlo ma ho una domanda. Ho modificato la domanda e ho aggiunto il mio adattatore. potresti lasciare ulteriori istruzioni per implementare Glide lì? – Niana

+0

molte grazie salvataggi :-) – Gattsu

+0

Ricevo un errore che il segnaposto del metodo non può essere risolto. Hai qualche idea del perché questo? La libreria Glide è stata, naturalmente, aggiunta al progetto. – XerXes

2

L'adattatore del tuo listview è responsabile della gestione delle viste delle tue file. Qual è l'aspetto del tuo adattatore? (l'oggetto che si chiama listview.setAdapter (Adapter) su).

All'interno dell'adattatore, c'è una chiamata di metodo getView che è necessario sovrascrivere e restituire un oggetto vista. È necessario chiamare view.findviewbyId() su questo oggetto di vista, non sulla vostra attività

UPDATE Prova rimuovere queste linee

holder.imageview.setImageResource(R.drawable.ic_launcher); 
     new DownloadImageTask(holder.imageview).execute(ArrayListDrivers.get(position).getImage()); 

P/s si può spiegare lo scopo di chiamare Glide.with (Context) .load (oggetto)? grazie

+0

Si prega di guardare il mio codice adattatore. Ho impostato la risorsa immagine in là – Niana

1

Nella tua AsyncTask constructor prova per inizializzare la visualizzazione di immagini come questa

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View convertView = inflater.inflate(R.layout.row, null, false); 
ivImage= (ImageView) convertView.findViewById(R.id.ivImage); 

qui row.xml in cui si dichiara ImageView ... e assicurarsi ivImage è variabile globale ... ora ivImage non è nullo. l'ho controllato .. ma è meglio usare la classe adapter per la gestione di listview row....

+0

Ho provato inflater = (LayoutInflater) getApplicationContext(). GetSystemService (context.LAYOUT_INFLATER_SERVICE); (nel onCreate) e Visualizza convertView = inflater.inflate (R.layout.row, null, false); ivImage = (ImageView) convertView.findViewById (R.id.ivImage); imgv.setImageResource (R.drawable.empty_head); nel metodo Aync ma ancora nessuna immagine predefinita – Niana

1

Ho risolto questo facendo qualcosa di molto semplice. In post exeucte del metodo aync ho semplicemente detto.

if (result != null){ 
       bmImage.setImageBitmap(result); 
      } 

In questo modo se è nullo, l'ImageView di default non saranno sovrascritti con "null" . Grazie per la guida

Problemi correlati