我有我的列表視圖自定義適配器刷新圖像,在ListView它設置每個圖像的AsyncTask從背景中的web服務加載圖像,然後顯示它。但圖像不斷刷新,有時會在一段時間後加載錯誤的圖像(第一次加載它顯示正確的圖像)LogoLoader是asynctask。我的列表視圖保持與LogoLoader的AsyncTask
適配器類:
public class SearchResultAdapter extends ArrayAdapter<SearchResultRowItem> {
Context context;
private MainActivity main;
public SearchResultAdapter(Context context, int resourceId, List<SearchResultRowItem> items,MainActivity main) {
super(context, resourceId, items);
this.context = context;
this.main = main;
}
/*private view holder class*/
private class ViewHolder {
ImageView imageView;
TextView txtTitle;
TextView txtDesc;
TextView txtAdres;
TextView txtAfstand;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
SearchResultRowItem rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.listitem, null);
holder = new ViewHolder();
holder.txtDesc = (TextView) convertView.findViewById(R.id.desc);
holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
holder.txtAdres = (TextView) convertView.findViewById(R.id.adres);
holder.txtAfstand = (TextView) convertView.findViewById(R.id.afstand);
holder.imageView = (ImageView) convertView.findViewById(R.id.logo);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.txtDesc.setText(Html.fromHtml(rowItem.getDesc()));
holder.txtTitle.setText(rowItem.getTitle());
holder.txtAdres.setText(rowItem.getAdres());
holder.txtAfstand.setText(rowItem.getAfstand());
if (holder.imageView != null && rowItem.hasLogo()) {
holder.imageView.setImageResource(R.drawable.loader);
LogoLoader logoLoader = new LogoLoader(holder.imageView, rowItem.getOrganisatieId(), 100, 100, main);
logoLoader.execute();
}
convertView.setBackgroundColor(position % 2 == 0 ? Color.WHITE : Color.parseColor("#F8F8F8"));
return convertView;
}
}
LogoLoader類:
public class LogoLoader extends AsyncTask<Void, Void, String> {
private ImageView imageView;
private UUID OrganisationGuid;
private int maxWidth;
private int maxHeight;
private MainActivity main;
public LogoLoader(ImageView imageView, UUID OrganisationGuid, int maxHeight, int maxWidth,MainActivity main) {
this.imageView = imageView;
this.OrganisationGuid = OrganisationGuid;
this.maxHeight = maxHeight;
this.maxWidth = maxWidth;
this.main = main;
}
@Override
protected String doInBackground(Void... params) {
WebserviceAdapter task = new WebserviceAdapter(
"api/Logo/GetLogos?ids="+OrganisationGuid.toString()+
"&maxWidth="+Integer.toString(maxWidth)+
"&maxHeight="+Integer.toString(maxHeight));
return task.result;
}
@Override
protected void onPostExecute(String result){
try {
JSONObject json = new JSONObject(result);
JSONArray jsonArray = json.getJSONArray("Results");
JSONObject imageObject = jsonArray.getJSONObject(0);
byte[] imageData = Base64.decode(imageObject.getString("Data").getBytes(), Base64.DEFAULT);
Drawable logoDrawable = null;
if (imageData != null) {
Bitmap logoBitmap = BitmapFactory.decodeByteArray(imageData, 0,
imageData.length);
logoDrawable = new BitmapDrawable(main.getResources(), logoBitmap);
}
imageView.setImageDrawable(logoDrawable);
} catch (JSONException e) {
imageView.setImageDrawable(null);
}
}
}
謝謝你爲我做的伎倆,我會稍後做緩存! –