1

我想在自定义 ArrayAdapter 中使用 AsyncTask 将用户联系人中的图像加载到 ImageView

这是我的图像加载代码片段:

class LoadImage extends AsyncTask<String, Void, Bitmap> 
{

    protected Bitmap doInBackground(String... ac) 
    {
        Bitmap contactPhoto = null;
        try 
        {
           ContentResolver cr = context.getContentResolver();
            Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            "DISPLAY_NAME = '" + ac[0] + "'", null, null);
            if (cursor.moveToFirst()) 
            {
                String contactId =
                    cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                //
                // Get the contact photo.
                //
                Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
                    Long.parseLong(contactId));
                InputStream input =
                    ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
                contactPhoto = BitmapFactory.decodeStream(input);
            }
            cursor.close();
            if(contactPhoto != null)
            {
                q.setImageBitmap(contactPhoto);
            }
            else
            {
               q.setImageResource(R.drawable.no_image);
            }
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        return contactPhoto;
    }

    @Override
    protected void onPreExecute()
    {

    }

    @Override
    protected void onPostExecute(Bitmap contactPhoto) 
    {


    }
 }

在此代码中,图像加载到错误的位置,例如,第 1 个人的 imgae 为第 3 个人设置了!

如果我将此代码放在 onPostExecute 方法中:

            if(contactPhoto != null)
            {
                q.setImageBitmap(contactPhoto);
            }
            else
            {
               q.setImageResource(R.drawable.no_image);
            }

什么都无法加载。我该如何解决这个问题?

4

1 回答 1

1

嗨,我希望这会对你有所帮助

    class LoadImage extends AsyncTask<String, Void, List<Bitmap>> 
{

    protected List<Bitmap> doInBackground(String... ac) 
    {
        List<Bitmap> totalBitmap = new ArrayList<Bitmap>();
        Bitmap contactPhoto = null;
        try 
        {
           ContentResolver cr = context.getContentResolver();
            Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            "DISPLAY_NAME = '" + ac[0] + "'", null, null);
            if (cursor.moveToFirst()) 
            {
                String contactId =
                    cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                //
                // Get the contact photo.
                //
                Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
                    Long.parseLong(contactId));
                InputStream input =
                    ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
                contactPhoto = BitmapFactory.decodeStream(input);
                totalBitmap.add(contactPhoto);
            }
            cursor.close();

        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        return totalBitmap;
    }

    @Override
    protected void onPreExecute()
    {

    }

    @Override
    protected void onPostExecute(List<Bitmap> contactPhoto) 
    {
        for (Bitmap bitmap : contactPhoto) {

            if(contactPhoto != null)
            {
                q.setImageBitmap(bitmap);
            }
            else
            {
               q.setImageResource(R.drawable.no_image);
            }

        }


    }
 }
于 2013-07-25T15:23:36.077 回答