0

リスト内の各アイテムに複数の画像が含まれている ListView があります。
リストを作成するときに、画像を非同期ダウンロードして、リストをすばやく表示し、ダウンロード時に画像がいっぱいになるようにします。

クラスを拡張しAsyncTask、単純なダウンロード メソッドを実装しました。ただし、次のリスト ビューで画像を正しい位置に更新する方法がわかりません。

@Override
protected void onPostExecute(Bitmap result) {

    // TODO show the downloaded image to the list

    super.onPostExecute(result);
}

これが私のクラス定義です:

public class ImageDownloadWorker extends AsyncTask<String, Void, Bitmap>

そして私のdoInBackground方法:

@Override
protected Bitmap doInBackground(String... params) {

    try {
        return downloadBitmap(params[0]);
    } catch (ClientProtocolException e) {

        return null;
    } catch (Exception e) {

        return null;
    }
}

ダウンロードした画像を、リスト内の正しいリスト項目の正しい ImageView にマップするために使用する必要がある一般的なパターンは何ですか? ありがとうございました!

4

2 に答える 2

1

リストビューにデータを入力するには、アダプター パターンを実装する必要があります。あなたの場合、カスタム アダプター クラスを作成し、BaseAdapter を拡張して、そのすべてのメソッドを実装できます。パターンはこのようになります。

MainActivity.java

public class MainActivity extends Activity {

    private ListView listView;
    private CustomAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        listView = findViewById(android.R.id.list);
    }

    private class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
        @Override
        protected Bitmap doInBackground(String... strings) {
            try {
              return downloadBitmap(params[0]);
            } catch (ClientProtocolException e) {
               return null;
            } catch (Exception e) {
               return null;
            }
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            adapter = new CustomAdapter(bitmap);
            listView.setAdapter(adapter);

            super.onPostExecute(bitmap);
        }
    }

    private class CustomAdapter extends BaseAdapter {

        private Bitmap bitmap;
        private LayoutInflater inflater = null;

        class ViewHolder {
            ImageView image;
        }

        public CustomAdapter(Bitmap bitmap) {
            this.bitmap = bitmap;
            inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return 0;
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int i, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if(convertView == null) {
                convertView = inflater.inflate(R.layout.list_item, parent, false);

                holder.image = convertView.findViewById(R.id.imageView);

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.image.setImageBitmap();

            return convertView;
        }
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

</LinearLayout>

list_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
    android:id="@+id/imageView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

</LinearLayout>

ただし、リストビューに多くの画像をロードする場合は、ArrayList を作成し、それを listAdapter に送信します。

于 2013-11-09T21:23:01.163 に答える
0

私は多くのプロジェクトであなたと同じことをする必要があり、このライブラリは非常に便利で使いやすいです:

https://github.com/koush/UrlImageViewHelper

于 2013-11-09T22:06:54.220 に答える