0

あなたの助けが必要です!

私のアプリケーションでは、 で画像を表示するときに奇妙な動作が発生しますGridView。セルには、デフォルトR.id.noimageおよび以前に表示された画像の代わりに画像が表示されます。このバグは、ビットマップをロードするためにアダプタを追加した後に発生しましたAsyncTask

私は何を間違っていますか?

コード:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = new ViewHolder();
    View vi = null;
    ImageView image;
    if(convertView==null) {
        vi = inflater.inflate(R.layout.gall_item, null);
        Log.i("info","convertView==null");
    } else {
        vi = inflater.inflate(R.layout.gall_item, null);
        Log.i("info","else");
    }
    holder.position = position;
    image = (ImageView)vi.findViewById(R.id.img);
    TextView url_img = (TextView)vi.findViewById(R.id.url_img);
    TextView cer = (TextView)vi.findViewById(R.id.cer);
    TextView idi = (TextView)vi.findViewById(R.id.ids);
    url_img.setText(img2[position]);
    cer.setText(cer_ar[position]);
    idi.setText(id_ar[position]);
    new LoadImageT(holder).execute(image, img1[position],activity.getApplicationContext(),position);
    return vi;
}

class LoadImageT extends AsyncTask<Object, Void, Bitmap> {
    Context context;
    private ImageView imv;
    private String url;
    private Bitmap bitmap = null;
    private int posS;
    private ViewHolder mHolder;

    public LoadImageT(ViewHolder holder) {
        mHolder = holder;
    }

    @Override
    protected Bitmap doInBackground(Object... params) {
        imv = (ImageView) params[0];
        url = (String) params[1];
        context = (Context)params[2];
        posS = (Integer) params[3];
        bitmap = imageLoader.getBitmaptrue(url,imv,context);
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        if (mHolder.position == posS) {
            imv.setVisibility(View.VISIBLE);
            imv.setImageBitmap(result);
        } else {
            int stub_id = R.drawable.noimage;
            imv.setImageResource(stub_id);
        }
    }
}
4

1 に答える 1

0

あなたは間違った方法でそれをやっています。ビューがnullの場合、まずandyが提案したように、ビューを膨らませてタグを設定し、nullではない場合にこのタグを使用しますが、リストビューの効率にのみ影響します。次に、アダプターから非同期タスク コードを削除し、それをアクティビティに入れ、オブジェクトを使用します。このリンクを参照してくださいGilles は、効率的な方法でマルチスレッドを実行する方法をうまく説明しています。

于 2012-09-15T12:06:07.207 に答える