3

リスト ビューの URL から取得したリスト ビューに多数の写真を表示する必要があります。残念ながら、ダウンロード時間には多少のばらつきがあります。実際のダウンロードは、ListView のアダプターで行われています。これらのダウンロードは runOnUIThread です。(はい、私はこれが恐ろしいデザインであることを知っています)。そのため、ダウンロードが完了すると画像が表示されるため、画像をキャッシュしているにもかかわらず、画像の表示が遅くなり、少し乱れます。

ロジックを書き直すつもりですが、それまでの間、写真を実際に表示する必要がある前にアダプターを動作させる方法を知りたいです。つまり、実際にリストをユーザーに表示する前に、アダプターを実行したいと考えています。これどうやってするの?ユーザーがリストを表示する前に、このダウンロードを実行したいと考えています。

つまり、リストがユーザーに表示される前に、アダプターで以下のメソッドを実行する必要があります。

 public View getView(final int position, View convertView, ViewGroup parent) 
 {
     // Inside here I am requesting the photo bitmap from url and setting to ImageView.
 }
4

4 に答える 4

4

オプション 1: アダプターのコンストラクターでプリロードする

アダプターのコンストラクターで、コレクションのリストを繰り返し処理し、イメージをイメージ ダウンローダーに送信してダウンロードを開始します。最初の 5 ~ 10 から開始するか、最大で約 50 にすることができます。ユーザーが携帯電話を使用する可能性が高い場合は、帯域幅の速度/コストに配慮し、プリロードを 20 程度に制限してください。

/** Constructor of MyAdapter extends ArrayAdapter<Item> */
public MyAdapter(Context context, List<Item> items) {
  super(context, 0, items);

  int limit = Math.min(10, items.size());
  for (int i = 0; i < limit; i++) {
    // don't fetch by position if `items` doesn't support random access
    AsyncImageLoader.prefetchImage(items.get(i).getImageUrl());
  }
}

-および/または-

オプション 2: 行をロードするときに、次の数行を事前にロードする

アダプターの getView で、次のいくつかのアイテムの画像を事前に読み込みます。例えば

public View getView(int position, View convertView, ViewGroup parent) {
  int limit = Math.min(position + 4, getCount());
  for (int i = position; i < limit; i++) {
    AsyncImageLoader.prefetchImage(getItem(i).getImageUrl());
  }
}
于 2012-11-09T09:36:40.087 に答える
3

実際には、リストビューにインターフェイスがgetAdapterあります。setAdapterあなたの場合のより良い考えは、事前にアダプターを作成し(独自に作成しBaseAdapter)、イメージのダウンロードを開始するように指示することです。setAdapterリストビューを表示する場合は、アダプタを呼び出して渡すだけです。

notifyDataSetChanged()ところで、新しいデータがあるときはいつでもアダプタから呼び出すことを忘れないでください。また、すべてのデータ更新はUIスレッドで行われる必要があることに注意してください;)

これはあなたのデザインにとって最も簡単な解決策です:)。他のオプションに興味があることを教えてください。

于 2012-07-27T23:31:56.283 に答える
1

Android用のピカソライブラリを使用できます。これは、画像のダウンロードに適したライブラリです。このコードを使用して、アダプターにイメージをプリロードできます。

public View getView(int position, View convertView, ViewGroup parent) {

  // Create your view here

  int lastImagePosition = Math.min(position + 4, getCount());

  for (int i = position + 1; i < lastImagePosition; ++i) {
    Picasso.with(getContext()).load(getItem(i)); //getItem() - if your adapter data are image urls
  }

  return createdView;
}
于 2014-10-07T07:05:08.363 に答える
-1

Frescolib は、リストビューの画像に最適なソリューションです。画像をダウンロードして表示したいだけの場合、Fresco はそれが来るまでプレースホルダーを表示します。 http://frescolib.org/docs/getting-started.html#_

いかに簡単に実装できるかをご覧ください。

XML で、カスタム名前空間を最上位要素に追加します。

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

次に、SimpleDraweeView をレイアウトに追加します。

<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/my_image_view"
    android:layout_width="130dp"
    android:layout_height="130dp"
    fresco:placeholderImage="@drawable/my_drawable"
  /> 

画像を表示するには、これを行うだけです。

Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/fresco-logo.png");
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(uri);

Fresco が残りの作業を行います。

画像の準備が整うまで、プレースホルダーが表示されます。ビューがオフスクリーンになると、画像がダウンロードされ、キャッシュされ、表示され、メモリから消去されます。

于 2015-08-13T06:40:14.227 に答える