2011-07-07 20 views
0

Webサービスにヒットし、その結果をListViewに表示するタスクを起動するListActivityがあります。結果のそれぞれには、画像IDが添付されています。ListViewの画像検索結果

画面に表示される行の画像ID(firstVisiblePosition()〜lastVisiblePosition())を取得し、別のWebサービスを照会するタスクを起動してこれらの項目の画像を表示するメソッドを作成しました。リストのスクロール状態がSCROLL_STATE_IDLEになったときにこのメソッドを呼び出します。これにより、ユーザーはスクロールできるようになり、表示行のイメージを取得するタスクはスクロールが停止するまで実行されず、オフスクリーン行のイメージをルックアップすることができなくなります。

私の問題は、最初に結果がListViewに表示されたときに、私のメソッドを呼び出して照会する画像IDを調べるという方法が見つからないということです。どうやら、setAdapterを呼び出した直後にこのメソッドを呼び出すことはできません(ListViewの作業の一部が非同期で行われるため、私は推測しています)。私は複数のアダプタを使用しています(理由はこの記事には関係ありません)ので、IDを取得するためにメソッドを呼び出す前にリストアイテムが表示されるのを待つ良い方法が必要です。

アイデア?あなたは、アダプタ上のアダプタを設定したり、notifyDatasetChanged()呼ばれた後は

答えて

1

、Runnableを通り、リストのポストキューにあなたの「ロード・イメージ」のコードを追加します。

list.post(new Runnable() { 
    @Override 
    public void run() { 
    //do stuff 
    } 
    }); 
+0

恐ろしいです。ありがとうございました。 – Andrew

+0

興味があれば、私はあなたが今やっているのと同じことをしました。私が望むほど正確ではない「SCROLL_STATE_IDLE」が見つかりました。私はこれを以前の回答としてここに掲載しました(http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview/6358818#6358818 )。 – dmon

0

私は右のあなたの質問を理解していた場合は、ネットとパフォーマンスの問題でイメージを読み込む際に問題が発生しています。もしそうなら、

は、私は、このようなローカルが、グローバルHashMapのように私のアダプタで簡単な画像のキャッシュを作成します。

 
private HashMap&ltString, Drawable> imgCache = new HashMap&ltString, Drawable>(); 

その後、私のgetViewメソッド()メソッドでは、私は非同期(スレッドとハンドラを使用します)画像をロードし、imgCacheにロードされた画像をキーとして位置を割り当て、Drawableとしてロードした画像を保存します。私が最初にloadImageが呼び出される前にイメージがすでに存在しているかどうかを確認するためにimgCacheを求めるだろう、私のgetViewメソッド()メソッドでも

 
final Handler h = new Handler() { 
    public void handleMessage(Message msg) { 
     if(msg.obj != null) { 
      Drawable drawable = (Drawable)msg.obj; 
      image.setImageDrawable(drawable); 
      image.postInvalidate(); 
      image.requestLayout(); 
      imgCache.put(cacheKey, drawable); 
     } 
    } 
}; 
loadImage(myImageView, imageURL, h); // threaded method which loads the images from net 

、。

これはあなたのリストを最適化し、このことができますなど

希望を複数のアダプタを使用してからあなたを救う必要があり、

-serkan

+0

私はこれをすべてやった。問題は、上から下にスクロールすると、getView()を使用してリストのすべてのイメージをロードすることです。これは時間と記憶の無駄です。それは、ユーザーが見ることができる画像を探してみるべきです。そこで、コードをgetViewからonScrollChangedに移動しました。 – Andrew