0

SDカードから画像を読み込んでリストビューに表示すると問題が発生します。最初は正常に読み込まれますが、上下にスクロールし始めると、画像はすべてアップされ、対応するリストアイテムに対応する画像ではありません。

これが私のアダプターです。

@Override
    public void bindView(final View view,final Context context,final Cursor cursor){
        final int id = cursor.getInt(0);;
        final QuickContactBadge image = (QuickContactBadge)view.findViewById(R.id.quickContactBadge1);
        image.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                if(!fromGame){
                    bowlerID = id;
                    Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    startActivityForResult(i,1);
                }
            }

        });
        String uri = cursor.getString(3);
        if(uri != null){
            image.setImageResource(R.drawable.ic_contact_picture);
            new LoadImage().execute(new Object[]{uri,image});
        }else{

        }

        TextView first = (TextView)view.findViewById(R.id.bListTextView);
        TextView last = (TextView)view.findViewById(R.id.bListTextView2);
        first.setText(cursor.getString(1));
        last.setText(cursor.getString(2));
    }

そして、私AsyncTaskは画像が表示されるビューと画像のURIを提供します

public class LoadImage extends AsyncTask<Object,Void,Object[]>{

    @Override
    protected Object[] doInBackground(Object... params) {
        String u = (String) params[0];

        InputStream input=null;
        try {
            input = getActivity().getContentResolver().openInputStream(Uri.parse(u));
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = false;
            Bitmap og = BitmapFactory.decodeStream(input,null,options);
            int height = options.outHeight;
            int width = options.outWidth;
            BitmapFactory.decodeResource(getResources(), R.drawable.ic_contact_picture, options);

            int imageHeight = options.outHeight;
            int imageWidth = options.outWidth;
            try {
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            float scaledHeight = ((float)imageHeight)/height;
            float scaledWidth = ((float)imageWidth)/width;

            Matrix matrix = new Matrix();
            matrix.postScale(scaledWidth, scaledHeight);

            Bitmap resize = Bitmap.createBitmap(og, 0, 0, width, height, matrix, true);
            try {
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return new Object[] {resize,params[1]};    
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public void onPostExecute(Object[] params){ 
        Bitmap resizedImage = (Bitmap)params[0];
        QuickContactBadge image = (QuickContactBadge) params[1];
        image.setImageBitmap(resizedImage);
    }

}

で画像を処理することと関係があると思いますAsyncTaskが、どうすれば修正できますか?

4

2 に答える 2

1

デフォルトの画像に戻すのを忘れていました

image.setImageResource(R.drawable.ic_contact_picture);
于 2012-08-09T19:32:00.597 に答える
0

ListView リサイクラに問題があると思います。ListView でスクロールすると、ListView アダプターは常に表示されている行 (n) のみをロードし、下に移動すると、最初の位置がリサイクルされて n+1 の位置になります。したがって、問題は、最初の位置の画像の読み込みを開始してから下にスクロールすることです。最初の位置は、スクロールされた ListView の 2 番目の位置になります。
解決策は、ロードされた画像を行の ID のようなものを使用して行に配置する必要があるかどうかを確認することです。この作業を行う Aquery などの ImageLoader ライブラリを使用することもできます。

于 2012-08-02T23:15:48.633 に答える