2011-10-17 3 views
2

...アンドロイドGalleryViewリサイクル

誰も私にgetView法上のGalleryViewへの基本的なリサイクルを表示することができます。代わりにあなたが欲しいビューにconvertViewを変換する必要がありgetViewに新しいImageViewを作成する

public class ImageAdapter extends BaseAdapter { 
    int mGalleryItemBackground; 
    private Context mContext; 

    private Integer[] mImageIds = { 
      R.drawable.sample_1, 
      R.drawable.sample_2, 
      R.drawable.sample_3, 
      R.drawable.sample_4, 
      R.drawable.sample_5, 
      R.drawable.sample_6, 
      R.drawable.sample_7 
    }; 

    public ImageAdapter(Context c) { 
     mContext = c; 

     TypedArray a = c.obtainStyledAttributes(R.styleable.HelloGallery); 
     mGalleryItemBackground = a.getResourceId(
       R.styleable.HelloGallery_android_galleryItemBackground, 0); 
     a.recycle(); 
    } 

    public int getCount() { 
     return mImageIds.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView i = new ImageView(mContext); 

     i.setImageResource(mImageIds[position]); 
     i.setLayoutParams(new Gallery.LayoutParams(150, 100)); 
     i.setScaleType(ImageView.ScaleType.FIT_XY); 
     i.setBackgroundResource(mGalleryItemBackground); 

     return i; 
    } 
} 
+0

リサイクルを意味しますか? whts prblmが発生する? –

答えて

5

。ここではそれを行うための一つの方法の例です。

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

    if (! convertView istanceof ImageView) 
    { 
     ImageView cv = new ImageView(mContext); 
     cv.setLayoutParams(new Gallery.LayoutParams(150, 100)); 
     cv.setScaleType(ImageView.ScaleType.FIT_XY); 
     cv.setBackgroundResource(mGalleryItemBackground); 

    } 
    cv.setImageResource(mImageIds[position]); 

    return cv; 
} 

単にあなたが望むものと一致するconvertViewを変換しますが、最初にその適切なビューの種類を確認してください。

更新:画像を表示する前に、ダウンサンプリングする必要があります。 res/drawableの下に500x500ピクセルの画像が保存されていると仮定しますが、画像は画面上で125x125ピクセルしか使用しません。イメージを表示する前に、イメージをダウンサンプリングする必要があります。あなたが最初にそのサイズ

int maxSize = 125; // make 125 the upper limit on the bitmap size 
int resId; // points to bitmap in res/drawable 

BitmapFactory.Options opts = new BitmapFactory.Options(); 
opts.inJustDecodeBounds = true; // Only get the bitmap size, not the bitmap itself 
BitmapFactory.decodeResource(c.getResources(), resId, opts); 

int w = opts.outHeight, h = opts.outHeight; 
int maxDim = (w>h)?w:h; // Get the bigger dimension 

を取得する必要がありますビットマップをダウンサンプリングする必要がどのくらい知ることは、今、私たちは大きさを持っているというイメージをダウンサンプリングするためにどのくらいの計算します。私たちは500×500ビットマップを持っているし、我々は125×125ビットマップをしたい場合は、私たちはint inSample = 500/125;

int inSample = maxDim/maxSize; 

opts = new BitmapFactory.Options(); 
opts.inSampleSize = inSample; 

から取得するすべての4つの画素のうち1を保つ今、単にリソースをデコードし、我々は我々のダウンサンプリングビットマップを持っています。

Bitmap b = BitmapFactory.decodeResource(c.getResources(), resId, opts); 

元のビットマップは影響を受けません。イメージを再度デコードし、opts.inSampleSize1に設定すると、500x500のビットマップイメージ全体が表示されます。

+0

私は試しましたが、まだゆっくりと、私はもっと何ができますか?画像解像度に関連付けられていてもよい。 (画像500x500) – musa

+2

あなたは間違いなく画像を縮小する必要があります。ピクセルあたり16ビットでは、500x500のビットマップには〜4MBのRAMが必要です。一方、125x125の画像は250KBのRAMしか必要としません。 – slayton

+0

はい、画像は500x500でなければなりません。各画像のサムネイルに追加しますか? images1.jpg、images1_thumb.jpg、ギャラリー上のこの画像を使用しています。これは余分なスペースを意味します。あなたはお勧めできますか? – musa

4

ギャラリーウィジェットには実際には常にnullのconvertViewが返されるバグがあります。つまり、convertViewを使用するgetViewメソッドを実装しても、パフォーマンスを向上させることはできません。これは、常に新しいものを作成するためです。一つの可能​​な解決策については

Check out this answer

。この人は基本的にギャラリーウィジェットを取り、それに必要な修正を加えました。 EcoGalleryをダウンロードして自分のパッケージに入れることで、適切にリサイクルするギャラリーウィジェットを使うことができます。その他のオプションは次のとおりです。(1)Viewオブジェクトのキャッシュを保持するための独自のロジックを実装します。 (2)ギャラリーと同様の効果を得るために、他のビューウィジェットの組み合わせをいくつか探して、実際のギャラリーウィジェットの代わりにそれらを使用します。

このEcoGalleryをダウンロードする場合は、サイトに記載されている3つのJavaファイルが必要です.SDKの中から2つの異なるxmlファイルを取得してプロジェクトに含める必要があります。

関連する問題