2014-04-16 17 views
6

Quello che sto cercando di fare è adattare il mio adattatore ListView personalizzato per usare le immagini recuperate dal web dalla libreria Picasso. Credo di avere cambiato il mio adattatore per poter accettare un'immagine da Picasso, ma non sono sicuro di come cambiare la mia implementazione per accettarla usando un ListView. Credo di dover accedere a holder.imageIcon, ma non sono sicuro di come farlo funzionare. Il mio codice è il seguente.Utilizzo della libreria Picasso con ListView

History.java

public class History { 
    public String score; 
    public String gametype; 
    public Picasso icon; 

    public History() { 
     super(); 
    } 

    public History(String score, String gametype, Picasso icon) { 
     super(); 
     this.score = score; 
     this.gametype = gametype; 
     this.icon = icon; 
    } 
} 

HistoryAdapter.java

public class HistoryAdapter extends ArrayAdapter<History> { 

    Context context; 
    int layoutResId; 
    History data[] = null; 

    public HistoryAdapter(Context context, int layoutResId, History[] data) { 
     super(context, layoutResId, data); 
     this.layoutResId = layoutResId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     HistoryHolder holder = null; 

     if(convertView == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      convertView = inflater.inflate(layoutResId, parent, false); 

      holder = new HistoryHolder(); 
      holder.imageIcon = (ImageView)convertView.findViewById(R.id.icon); 
      holder.textTitle = (TextView)convertView.findViewById(R.id.gameType); 
      holder.textScore = (TextView)convertView.findViewById(R.id.score); 

      convertView.setTag(holder); 
     } 
     else 
     { 
      holder = (HistoryHolder)convertView.getTag(); 
     } 

     History history = data[position]; 
     holder.textScore.setText(history.score); 
     holder.textTitle.setText(history.gametype); 
     holder.imageIcon.setImageResource(history.icon); 


     return convertView; 
    } 

    static class HistoryHolder 
    { 
     ImageView imageIcon; 
     TextView textTitle; 
     TextView textScore; 
    } 
} 

Attuazione

History[] historyData = new History[games.length()]; 


for(int i = 0; i < games.length(); i++) { 
        JSONObject c = games.getJSONObject(i); 
        JSONObject gameStats = games.getJSONObject(i).getJSONObject(TAG_STATS); 
        type[i] = c.getString(TAG_TYPE); 
        champId[i] = c.getString("championId"); 
        cs[i] = gameStats.getString("minionsKilled"); 
        kills[i] = gameStats.getString("championsKilled"); 
        deaths[i] = gameStats.getString("numDeaths"); 
        assists[i] = gameStats.getString("assists"); 
        win[i] = gameStats.getString("win"); 

        if(win[i].equals("true")) 
         win[i] = "Victory"; 
        else 
         win[i] = "Defeat"; 

        if(type[i].equals("RANKED_SOLO_5x5")) 
         type[i] = "Ranked (Solo)"; 

        if(type[i].equals("CAP_5x5")) 
         type[i] = "TeamBuilder"; 

        if(type[i].equals("NORMAL")) 
         type[i] = "Unranked"; 

        score[i] = kills[i] +"/" + deaths[i] + "/" + assists[i]; 

        historyData[i] = new History(score[i], champId[i], R.drawable.ic_launcher); // Placeholder image 

       } 

       if(historyData == null) { 
        historyData[0] = new History("No game found", "N/A", R.drawable.ic_launcher); // Use Picasso placeholder 
        Log.i("Data", "" + historyData); 
       } 

       adapter = new HistoryAdapter(MatchHistoryActivity.this, 
         R.layout.list_adapter, 
         historyData); 

       list.setAdapter(adapter); 

list_item.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:background="#111111" 
    android:padding="6dip" > 

    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginRight="6dip" 
     android:contentDescription="TODO" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:id="@+id/score" 
     android:textColor="#C49246" 
     android:layout_width="fill_parent" 
     android:layout_height="26dip" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_marginLeft="5dp" 
     android:layout_toRightOf="@id/icon" 
     android:ellipsize="marquee" 
     android:singleLine="true" 
     android:text="0/0/0 KDA" 
     android:textSize="12sp" /> 

    <TextView 
     android:id="@+id/gameType" 
     android:textColor="#C49246" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@id/score" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:layout_alignWithParentIfMissing="true" 
     android:layout_marginLeft="5dp" 
     android:layout_toRightOf="@id/icon" 
     android:gravity="center_vertical" 
     android:textSize="16sp" /> 

</RelativeLayout> 
+0

leggere il doc? c'è una sezione sugli adattatori http://square.github.io/picasso/ tipicamente passeresti un url. – njzk2

+0

Ah, ho completamente trascurato quella sezione. Colpa mia. Grazie. – Nate

risposta

16

Ci sono 2 cose che è necessario modificare: 1) History.icon deve essere l'URL String dell'icona, non un oggetto Picasso. Puoi anche utilizzare uno File, Uri o int, ma un URL String è probabilmente quello che desideri.

2) Modificare il metodo di Adapter'sgetView() per caricare l'icona usando Picasso (vedere l'ultima riga prima getView() restituisce il convertView):

public class HistoryAdapter extends ArrayAdapter<History> { 

    Context context; 
    int layoutResId; 
    History data[] = null; 

    public HistoryAdapter(Context context, int layoutResId, History[] data) { 
     super(context, layoutResId, data); 
     this.layoutResId = layoutResId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     HistoryHolder holder = null; 

     if(convertView == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      convertView = inflater.inflate(layoutResId, parent, false); 

      holder = new HistoryHolder(); 
      holder.imageIcon = (ImageView)convertView.findViewById(R.id.icon); 
      holder.textTitle = (TextView)convertView.findViewById(R.id.gameType); 
      holder.textScore = (TextView)convertView.findViewById(R.id.score); 

      convertView.setTag(holder); 
     } 
     else 
     { 
      holder = (HistoryHolder)convertView.getTag(); 
     } 

     History history = data[position]; 
     holder.textScore.setText(history.score); 
     holder.textTitle.setText(history.gametype); 
     Picasso.with(this.context).load(history.icon).into(holder.imageIcon) 


     return convertView; 
    } 

    static class HistoryHolder 
    { 
     ImageView imageIcon; 
     TextView textTitle; 
     TextView textScore; 
    } 
} 
+0

questa risposta davvero utile – riza

+0

Molto utile anzi, devo ammettere –

Problemi correlati