使用AsyncTask将图像加载到ListView的适配器中

时间:2014-09-06 22:43:33

标签: java android listview android-asynctask

你好,所以我的列表视图包含歌曲和AlbumArt有问题,我想制作AsyncTask来获取背景中的专辑艺术。

把它给我一个NullPointer或者专辑艺术是空白请帮助

ImageLoader.java

public class ImageLoader extends AsyncTask<Object, String, Bitmap> {

private View view;
private Bitmap bitmap = null;
public static BitmapDrawable drawable = null;
Context context;
Cursor cursor;
long albumId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));

@Override
protected Bitmap doInBackground(Object... parameters) {

    // Get the passed arguments here
    final Uri ART_CONTENT_URI = Uri.parse("content://media/external/audio/albumart");
    Uri albumArtUri = ContentUris.withAppendedId(ART_CONTENT_URI, albumId);
    ContentResolver res = context.getContentResolver();
      InputStream in;

      try {
          if(bitmap != null)
          {
            bitmap = null;
              if(drawable != null)
              {
                  drawable = null;
              }
          }
          in = res.openInputStream(albumArtUri);
          bitmap = BitmapFactory.decodeStream(in);
          Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 1280, 720, false);
          // bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), albumArtUri);
          drawable = new BitmapDrawable(context.getResources(), resizedBitmap);
      } catch (FileNotFoundException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
          drawable = (BitmapDrawable) context.getResources().getDrawable(R.drawable.default_artwork);
      };
    return bitmap;
}

@Override
protected void onPostExecute(Bitmap bitmap) {
    if (bitmap != null && view != null) {
        ImageView albumArt = (ImageView) view.getTag(R.id.iconlist);
        albumArt.setImageBitmap(bitmap);
    }
}
}

SongAdapter.java

public class SongAdapter extends CursorAdapter implements SectionIndexer{
private String mSections = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";



private final LayoutInflater mInflater;


 public SongAdapter(Context context, Cursor c, int textViewResourceId,
        List<String> objects) {
    super(context, c,textViewResourceId);
    new ImageLoader().execute();
    mInflater=LayoutInflater.from(context);

}





@Override
public void bindView(View view, Context context, Cursor cursor) {
    TextView title1 = (TextView) view.findViewById(R.id.titlelist);
    TextView artist1 = (TextView) view.findViewById(R.id.artistlist);
    ImageView album1 = (ImageView) view.findViewById(R.id.iconlist);

    String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
    String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
    String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
   long albumId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
      StringBuilder titleBuild = new StringBuilder();
      titleBuild.append(title);
      if(titleBuild.length() > 35)
      {
      titleBuild.setLength(32);
      title = titleBuild.toString()+"...";
      }
      else
      {
          title = titleBuild.toString();
      }
      StringBuilder artistBuild = new StringBuilder();
      artistBuild.append(artist);
      if(artistBuild.length() > 35)
      {
      artistBuild.setLength(32);
      artist = artistBuild.toString()+"...";
      }
      else
      {
      artist = artistBuild.toString();
      }






album1.setImageDrawable(ImageLoader.drawable);
title1.setText(title);
artist1.setText(artist);
}







@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    // TODO Auto-generated method stub
    LayoutInflater inflater = (LayoutInflater)context.getSystemService
              (Context.LAYOUT_INFLATER_SERVICE);
    return inflater.inflate(R.layout.rowlayout, parent, false);
}@Override
public int getPositionForSection(int section) {
    // If there is no item for current section, previous section will be selected
    for (int i = section; i >= 0; i--) {
        for (int j = 0; j < getCount(); j++) {
            if (i == 0) {
                // For numeric section
                for (int k = 0; k <= 9; k++) {
                    if (StringMatcher.match(String.valueOf(( getItem(j))), String.valueOf(k)))
                        return j;
                }
            } else {
                if (StringMatcher.match(String.valueOf(getItem(j)), String.valueOf(mSections.charAt(i))))
                    return j;
            }
        }
    }
    return 0;
}

@Override
public int getSectionForPosition(int position) {
    return 0;
}

@Override
public Object[] getSections() {
    String[] sections = new String[mSections.length()];
    for (int i = 0; i < mSections.length(); i++)
        sections[i] = String.valueOf(mSections.charAt(i));
    return sections;
}
}

现在这段代码给了我一个空指针所以任何帮助都会很棒

1 个答案:

答案 0 :(得分:0)

Async任务中的视图对象从未初始化,至少我看不到该代码。我认为你可以做的是为每个&#34; new&#34;推出一个新的AsyncTask。查看您在适配器中创建的内容。您需要使异步任务具有对要填充的imageview的引用。一种方法就是这样。

public class ImageLoader extends AsyncTask<Object, String, Bitmap> {

private WeakReference<ImageView> mReference;
private View view;
private Bitmap bitmap = null;
public static BitmapDrawable drawable = null;
Context context;
Cursor cursor;
long albumId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));

public ImageLoader(ImageView imageView) {
      mReference = new WeakReference<ImageView>(imageView);
}

@Override
protected Bitmap doInBackground(Object... parameters) { ... your code }

@Override
protected Void onPostExecute(Bitmap bitmap) {
 if(mReference != null) {
    if(bitmap != null) {
     ImageView view = mReference.get();
     // note that this could still return null if the view or the reference has been 
     // garbage collected which it could be since it is a weak reference, so you should
     // always check the status in this case.

     //do what you want with the image view. 
    }
  } 
}

然后在您的适配器中执行类似的操作。

public class SongAdapter extends CursorAdapter implements SectionIndexer{

...other code... 

@Override
public void bindView(View view, Context context, Cursor cursor) {
    TextView title1 = (TextView) view.findViewById(R.id.titlelist);
    TextView artist1 = (TextView) view.findViewById(R.id.artistlist);
    ImageView album1 = (ImageView) view.findViewById(R.id.iconlist);

    String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
    String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
    String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
   long albumId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
      StringBuilder titleBuild = new StringBuilder();
      titleBuild.append(title);
      if(titleBuild.length() > 35)
      {
      titleBuild.setLength(32);
      title = titleBuild.toString()+"...";
      }
      else
      {
          title = titleBuild.toString();
      }
      StringBuilder artistBuild = new StringBuilder();
      artistBuild.append(artist);
      if(artistBuild.length() > 35)
      {
      artistBuild.setLength(32);
      artist = artistBuild.toString()+"...";
      }
      else
      {
      artist = artistBuild.toString();
      }



<---->
// new code
new ImageLoader(album1).execute();

// old code album1.setImageDrawable(ImageLoader.drawable);
title1.setText(title);
artist1.setText(artist);
}

}

我在网格视图中使用了类似的技术并且很酷,因为您实际上可以看到每个图像视图都已填充。

希望有所帮助!