0

グリッドビューにいくつかの画像を表示するようにコーディングしました。画像はURLから表示されています。私が直面している問題は、スクロールすると画像が置き換えられることです..そして、開始すると画像の順序が変わり続けます..これにより、グリッド内の画像をクリックすると、完全な画像の表示が遅れます..助けてください!

コード:

public class ImageAdapter extends BaseAdapter {

    private Context mContext;
    private TextView txtUrl;
    private String response;
    public ImageView imageView;
    public static String[] mThumbIds;
    public ImageAdapter(Context c,String resp) {
        mContext = c;
        response = resp.trim();
        mThumbIds = resp.split(",");
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(95, 95));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(6, 6, 6, 6);
        } else {
            imageView = (ImageView) convertView;
        }


        try {
             new LoadImageGrid(imageView).execute(mThumbIds[position]);

        } catch(Exception e) {
            txtUrl.setText("Error: Exception");
        }

        return imageView;

    }



class LoadImageGrid extends AsyncTask<String, Void, Drawable>
{

    ImageView imageView;
    public LoadImageGrid(ImageView im){
        imageView = im;
    }
    @Override
    protected Drawable doInBackground(String... args) {
        String url = args[0];
        Drawable d = null;
        try {
            d = Drawable.createFromStream((InputStream) new URL(url).getContent(), "src");
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return d;

    }


    @Override
    protected void onPostExecute(Drawable d) {
        imageView.setImageDrawable(d);
    }
4

2 に答える 2

1

グリッドビューをスクロールすると、表示されていない画像ビューがconvertViewパラメーターとしてgetView()に戻ります。しかし、asyncTaskは停止せず、

imageView.setImageDrawable(d);

ダウンロードした画像を間違った位置のビューに適用することになります。同じimageViewを再利用するためです。クイックフィックスは、convertViewを使用しないことです。ただし、アプリの速度は少し遅くなります。

于 2013-03-08T16:38:12.010 に答える
0

これはビューの変換に関連しているようです。convert ビューを使用して画像のスペースを再利用する場合は、そのスコープ内で Imageview を使用する必要があります。現在のクラス コード内の ID でイメージビューを見つけてから、それを生成することをお勧めします。

于 2013-03-08T16:33:15.560 に答える