我正在尝试做的是调整我的自定义ListView适配器以使用Picasso库从网络获取的图像.我相信我已经更改了适配器以接受来自毕加索的图像,但我不确定如何使用ListView更改我的实现以接受它.我相信我必须访问holder.imageIcon,但我不知道如何让它运行起来.我的代码如下.
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; } }
履行
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>
解决方法
您需要更改两件事:
1)History.icon应该是图标的String url,而不是Picasso对象.您也可以使用File,Uri或int,但String url可能就是您想要的.
1)History.icon应该是图标的String url,而不是Picasso对象.您也可以使用File,Uri或int,但String url可能就是您想要的.
2)修改Adapter的getView()方法,使用Picasso加载图标(请参阅getView()返回convertView之前的最后一行):
public class HistoryAdapter extends ArrayAdapter<History> { Context context; int layoutResId; History data[] = null; public HistoryAdapter(Context context,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; } }