2011-10-11 7 views
14

ImageAdapterを持つギャラリーを使用して、イメージを自分のリソースから取り出すImageViewsをロードしています。私の問題は、私のアダプタのgetView()メソッドに渡されるconvertViewは常にnullです。つまり、getView()が呼び出されるたびに新しいImageViewが作成されます。これは、GCが常に作成され、ImageViewの使用されていないこれらのすべてを取り除くためにGCが絶え間なく実行されているため、恐ろしい事前成績につながります。ギャラリーImageAdapter convertViewは常にnullです

これは明らかに既知のバグです。Gallery's view cache is broken; never converts views.です。

私の二つの好ましい解決策は、どちらか1.アダプタ自体のビューのキャッシュを処理し、それらを適切に再使用するために必要なすべてのロジックの世話をしています。 または2.ギャラリーウィジェットの独自のコピーを含めて、リサイクルされたビューを適切に返すように修正してください。

私はオプション1を実装し始めましたが、その操作の背後にあるすべてのロジックをどうやって作成するのか正確にはわかりません。私はオプション2がもっと簡単かもしれないと考えるようになっています。

私はここにギャラリーウィジェットのコードを見つけた:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/widget/Gallery.java

私は完全にそれを理解していないが、私はそれがライン745マイ(上

child = mAdapter.getView(position, null, this); 

を呼び出していることがわかります暗闇の中で撮影)これが問題の根源だと推測します。

誰もがこのバグを経験していますか?または、リサイクラーの状況が正しく機能するようにこのウィジェットを微調整できるようにするために、誰かが正しい方向に私を向けることができますか?あるいは、私が見落としている可能性がある代替オプションを提案してください。

EDIT:私が今までに見つけた最良の解決策は、EcoGalleryという実装でした。私はそれを参照できる唯一の場所online anymore is here。それを機能させるには、そこから各チャンクをプロジェクト内の正しい場所に配置する必要があります。

+0

私はそれを助けるhttp://stackoverflow.com/questions/10769989/how-do-i-get-the-selected-item-from-a-gridview-with-imageadapter-android –

答えて

3

特にこのバグは経験していませんが、サードパーティのビューページャ(サポートライブラリの前)でカスタムキャッシュを行っています。

正直言ってそれほど難しいことではありません。私の場合は、画面上に1つのアイテムしか存在しないことが分かっていました。しかし、私はまた、左と右のアイテムがプリロードされていることを望んでいました(これらはウェブからデータをネットから引き出していました)。だから、私は3つのビューの単純な配列を持っています。

[V1, V2, V3] 

ここでは、アダプタ内の位置とキャッシュ内の位置を関連付けるだけです。あなたがこれに取り組むことができる様々な方法があります。私が最初にスパイクしたとき、私はちょうど私の現在のビューがV2であり、ページャをひっくり返すときにアレイのアイテムを回転させたものを作った。だから次のビューにフリップすると、私の配列が変わるだろう

[V2, V3, V1] 

それに追いつくのは簡単だった。または、数学を行い、キャッシュの相対位置への位置を計算することもできます。

最後に、先入れ先出しキューを作成する方法もあります。ビューをキューにプッシュしてリサイクルし、ビューが必要なときはビューをポップするだけです。

+0

私はしばらくの間私のためにビューを保持するQueueオブジェクト決してそれを働かせませんでしたが、私はそうすることができると同意します=) – FoamyGuy

+0

あなたのビューをキャッシュするビュー配列を使用し、 'cachePos = position%VIEW_CACHE_SIZE' – shaobin0604

1

私はギャラリーウィジェットでの経験はありませんが、私は画像とともに多くのリストビューを使用しています。あなたの問題とGoogleの問題へのリンクによれば、彼らはまだこの問題を解決していません。

したがって、キャッシュ/ ajaxの問題などを解決する素晴らしいライブラリ(およびその中の例)を持つs​​olutioがあります。 library

または、より具体的に

リンク、画像へのリンクexamples

あなたが彼らの例をダウンロードした場合、あなたは彼らが

にそのAQueryユーティリティクラスを使用して、ギャラリーのウィジェットでギャラリーを実装する方法を見つけるだろう

com.androidquery.test.image.ImageLoadingGalleryActivityクラス。写真だけPOJOオブジェクト(遠隔からフェッチ)である

final List<Photo> entries;// here only to show what enteries are... 

    listAq = new AQuery(this); //define as Action class member, here only to show what it is 

    ArrayAdapter<Photo> aa = new ArrayAdapter<Photo>(this, R.layout.gallery_item, entries){ 

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

      if(convertView == null){ 
       convertView = getLayoutInflater().inflate(R.layout.gallery_item, parent, false); 
      } 

      Photo photo = getItem(position); 

      AQuery aq = listAq.recycle(convertView); 

      aq.id(R.id.name).text(photo.title); 

      String tbUrl = photo.tb; 

      if(!aq.shouldDelay(position, convertView, parent, tbUrl)){ 
       aq.id(R.id.tb).image(tbUrl); 
       aq.id(R.id.text).text(photo.title).gone(); 
      }else{ 
       aq.id(R.id.tb).clear(); 
       aq.id(R.id.text).text(photo.title).visible(); 
      } 


      return convertView; 

     } 


    }; 

    aq.id(R.id.gallery).adapter(aa); 

:コードから

スニペット

class Photo { 
    String tb; 
    String url; 
    String title; 
    String author; 
} 

R.id.gallery

<Gallery 
     android:id="@+id/gallery" 
     android:layout_width="fill_parent" 
     android:layout_height="200dip" /> 

そしてR.layout.gallery_itemを指すを指す:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="100dip" 
     android:layout_height="75dip" > 

     <ProgressBar 
      android:id="@+id/progress" 
      android:layout_width="15dip" 
      android:layout_height="15dip" 
      android:layout_centerInParent="true" /> 

     <ImageView 
      android:id="@+id/tb" 
      style="@style/GalleryItem" 
      android:layout_width="100dip" 
      android:layout_height="75dip" /> 

     <TextView 
      android:id="@+id/text" 
      android:layout_width="100dip" 
      android:layout_height="75dip" 
      android:gravity="center" 
      android:maxLines="4" 
      android:padding="15dip" 
      android:text="Dummy TextDummy TextDummy TextDummy TextDummy Text" 
      android:textColor="#FFFFFFFF" 
      android:textSize="8sp" /> 

    </RelativeLayout> 

このライブラリは、あなたの問題解決に役立つことを願っています。

0

dskinnerが示唆しているように、カスタムキャッシュを使用してこの問題を回避しました。

一度に画面上にギャラリーに表示できる項目の最大数(項目の画面幅/最小値)を追加して追加します(ギャラリーには、あなたがそれをスクロールするときに右に)。このサイズの配列を作成します。ビューはリクエストされたときに作成され、キャッシュに配置されます。 getViewが呼び出されたときに返されるキャッシュされたビューを特定するには、position%cachesizeを使用します。

+0

少しのコードサンプル、またはいくつかのコード/ここでたくさん助けてください。 – iwein

関連する問題