5

次のコードに非同期画像ローダーを実装する際に問題が発生しました。私はそれについてウェブの周りのいくつかの投稿を読み、その背後にある論理を理解していると思いますが、それを実装するのに失敗しているようです。

以下のコードは、リストビューに画像をロードするために使用するものです。

public class MyCustomAdapter extends ArrayAdapter<RSSItem> {
   Bitmap bm;

   public MyCustomAdapter(Context context, int textViewResourceId, List<RSSItem> list) {
      super(context, textViewResourceId, list); 
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      BitmapFactory.Options bmOptions;
      bmOptions = new BitmapFactory.Options();
      bmOptions.inSampleSize = 1;
      bm = LoadImage(myRssFeed.getList().get(position).getDescription(), bmOptions);

      View row = convertView;

      if(row == null) {
         LayoutInflater inflater = getLayoutInflater();
         row = inflater.inflate(R.layout.rsslist, parent, false); 
      }

      TextView listTitle = (TextView)row.findViewById(R.id.listtitle);
      listTitle.setText(myRssFeed.getList().get(position).getTitle());
      ImageView listDescription = (ImageView)row.findViewById(R.id.listdescription);
      listDescription.setImageBitmap(bm);
      TextView listPubdate = (TextView)row.findViewById(R.id.listpubdate);
      listPubdate.setText(myRssFeed.getList().get(position).getPubdate());

      return row;
   }
}
4

3 に答える 3

8

ListViewでの画像の遅延読み込みの参照として私のサンプルコードを使用できます

于 2010-07-05T11:56:06.053 に答える
1

SmartImageViewを見たことがありますか? http://loopj.com/android-smart-image-view/

画像を非同期でロードするのは非常にシンプルなライブラリです(:

このライブラリのいくつかの機能

ImageViewのドロップイン置換URLから画像を読み込む電話の連絡先アドレスブックから画像を読み込む画像の非同期読み込み、読み込みはUIスレッドの外部で行われます画像はメモリとディスクにキャッシュされ、超高速読み込みを行いますSmartImageクラスは簡単に拡張できます他の情報源

于 2013-07-27T11:43:13.857 に答える
0

解決策は、アダプタ内のクラス変数、たとえば、すべての「ImageViewlistDescription」を参照するArrayListを設定することです。

ArrayList<ImageView> allImageViews = new ArrayList<ImageView>();    
    ...

    public View getView(int position, View convertView, ViewGroup parent){
       ...
       ImageView listDescription=(ImageView)row.findViewById(R.id.listdescription);
       allImageViews.add(listDescription);
       ...
    }

    private class ImageDownLoader extends AsyncTask<ArrayList, Void, Void>{
       doInBackground(){
         for(ImageView imageView: allImageViews){
         BitmapFactory.Options bmOptions;
         bmOptions = new BitmapFactory.Options();
         bmOptions.inSampleSize = 1;
         bm = LoadImage(imageNameOrWhatever, bmOptions);
         imageView.setImageBitmap(bm);
       } 
    }

次に、各ImageViewを通過し、関連付けられたImageを取得し、ArrayListからImageViewを削除するAsyncTaskを使用します。GUIが応答している間、バックグラウンドで一度に1つずつダウンロードされます。

于 2010-07-05T11:17:03.293 に答える