このような質問をいくつか見ましたが、少し異なる問題が発生しているようです。だからここで誰かに聞いてみようと思いました。
textviewとimageviewを備えたカスタムリストビューがあります。非同期タスクを使用して画像を読み込んでから、postexecuteメソッドで画像をimageviewに設定しています。画像は正常に読み込まれていますが、一部の画像が他の画像に置き換えられています。ただし、すべての画像の読み込みが完了すると、各画像ビューに適切な画像が表示されます。しかし、なぜこの問題が発生するのか理解できないようです。
これが私のアダプターと非同期タスククラスです。ありとあらゆる助けをいただければ幸いです。
編集私は今タグを追加しています(タグはそれぞれのtextviewのimageviewsに入るテキストです)そして私の投稿の実行で私はタグがtextviewからのテキストと等しいかどうかをチェックしています。私はまだ以前と同じ問題を抱えています。
これが私のAdapterクラスです:
public class CustomListAdapter extends ArrayAdapter<CustomList> {
Context context;
int layoutResourceId;
LinkedList<CustomList> data = null;
LinkedList<String> title_list = new LinkedList();
LoadImage l;
CustomList cl;
ProgressBar pb;
HashMap <String, Bitmap> bitmap = new HashMap<String, Bitmap>();
public CustomListAdapter(Context context, int layoutResourceId, LinkedList<CustomList> data, LinkedList<Bitmap> bitmap_list) {
super(context, layoutResourceId, data);
// TODO Auto-generated constructor stub
this.context = context;
this.layoutResourceId = layoutResourceId;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View row = convertView;
CustomListHolder holder = null;
if(row == null){
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new CustomListHolder();
holder.text = (TextView)row.findViewById(R.id.txtTitle);
holder.thumbnail = (ImageView)row.findViewById(R.id.imgIcon);
holder.pb = (ProgressBar)row.findViewById(R.id.progressBar1);
row.setTag(R.id.id0, holder);
cl = data.get(position);
holder.text.setText(cl.title);
holder.thumbnail.setImageResource(R.drawable.icon);
holder.pb.setVisibility(View.VISIBLE);
row.setTag(R.id.id1,new String(cl.title));
LoadImage li = new LoadImage(context, holder.thumbnail, cl.icon,cl.title, bitmap,holder.pb,row);
li.execute(cl.icon);
}
else{
Log.e("Row not null","Inside");
holder = (CustomListHolder)row.getTag(R.id.id0);
//row.getK
cl = data.get(position);
holder.text.setText(cl.title);
holder.thumbnail.setImageResource(R.drawable.icon);
holder.pb.setVisibility(View.VISIBLE);
if((Bitmap) bitmap.get(cl.title) == null){
row.setTag(R.id.id1,new String(cl.title));
LoadImage li = new LoadImage(context, holder.thumbnail, cl.icon,cl.title, bitmap,holder.pb,row);
li.execute(cl.icon);
}
else {
holder.thumbnail.setImageBitmap((Bitmap) bitmap.get(cl.title));
holder.pb.setVisibility(View.GONE);
}
}
return row;
}
static class CustomListHolder
{
ImageView thumbnail;
TextView text;
ProgressBar pb;
}
}
これが私の非同期タスククラスです:
パブリッククラスLoadImageはAsyncTaskを拡張します{
Context callingContext = null;
ImageView view;
String bits;
public ProgressBar pb;
HashMap<String, Bitmap> bitmap;
String url;
String text;
View row;
public LoadImage(Context c, ImageView view, String bits, String text, HashMap<String, Bitmap> bitmap, ProgressBar pb, View row){
this.view = view;
this.bits = bits; // url for image
this.callingContext = c;
this.bitmap = bitmap; //hashmap
this.text = text;// title text
this.pb = pb;
this.row = row;
}
public Bitmap getBitmap(String data){
Bitmap bitmap;
BitmapFactory.Options bmOptions;
bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
Log.e("getBitmap",text);
try {
bitmap=null;
InputStream is=new URL(data).openStream();
BitmapFactory.decodeStream(is, null, bmOptions);
is.close();
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = 10;
is = new URL(data).openStream();
bitmap = BitmapFactory.decodeStream(is, null, o2);
bitmap = Bitmap.createScaledBitmap(bitmap, 60, 60, true);
is.close();
this.bitmap.put(text,bitmap);
return bitmap;
} catch (Exception ex){
Log.e("Debug", ex.getMessage());
return null;
}
}
@Override
protected Bitmap doInBackground(String... arg0) {
// TODO Auto-generated method stub
Log.e("do In Bg",text);
Bitmap b = null;
if((Bitmap)bitmap.get(text) == null)
b = getBitmap(bits);
else
b =(Bitmap)bitmap.get(text);
return b;
}
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(row.getTag(R.id.id1).equals(text)){
view.setImageBitmap((Bitmap)bitmap.get(text));
pb.setVisibility(View.GONE);
}
}
}
CustomListは、2つの文字列アイコンとタイトルを持つクラスです。アイコンは画像のURLで、タイトルはテキストビューのテキストです。