GridView、グリッドビューに入れた画像が綺麗にならない、バラバラになる

みんな大好きグリッドビュー。

// 入れ込むべきレイアウト
GridView gridView = (GridView) v.findViewById(R.id.gridView);
gridView.setAdapter(new ImageAdapter(context, imageUrlList));

こうやって使いまっさ。ImageAdapterは独自のもの。そこに、context imageUrlListを渡します。

しかし、GridView、文字をいれるだけだと楽勝であるのだが、ネットから画像をよみこんでいれるとなるときっついのだ。それぞれの大きさがバラバラになったりして泣きそうになるのだ。他のサイトではすごく簡単にやり遂げているが。

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;

import java.util.List;

/**
 * イメージローダー
 */
public class ImageAdapter extends ArrayAdapter<String> {

	public final String TAG = "ImageAdapter";

	private Context context;
	private RequestQueue mQueue;
	private ImageLoader mImageLoader;

	public ImageAdapter(Context context, List<String> objects) {
		super(context, 0, objects);
		this.context = context;
		mQueue = Volley.newRequestQueue(getContext());
		mImageLoader = new ImageLoader(mQueue, new BitmapCache());
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		String url = getItem(position);

		ImageView imageView;

		if (convertView == null) {
			imageView = new ImageView(getContext());

		} else {
			imageView = (ImageView) convertView;
		}
		// 画像取得処理
		ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);

		// BASIC認証
		mImageLoader = new BasicAuthImageLoader(mQueue, new ImageLoader.ImageCache() {
			private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(100);

			public void putBitmap(String url, Bitmap bitmap) {
				mCache.put(url, bitmap);
			}

			public Bitmap getBitmap(String url) {
				return mCache.get(url);
			}
		});

		mImageLoader.get(url, listener);

		// 画像のサイズをここで固定
		imageView.setMinimumWidth(300);
		imageView.setMinimumHeight(200);
		imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

		// クリックイベント
		imageView.setOnClickListener(new View.OnClickListener() {

					public String url;

					public View.OnClickListener setUrl(String url) {
						this.url = url;
						return this;
					}

					public void onClick(View v) {
						// イメージ画像がクリックされたときに実行される処理
						Log.d(TAG, "url= " + url);

						// 画面遷移
						Intent intent = new Intent(context, TSUGINO_GAMEN.class);
						intent.putExtra("photoUrlAddress", url);
						context.startActivity(intent);

					}
				}.setUrl(url)
		);

		return imageView;
	}


}

ここで、

// 画像のサイズをここで固定
imageView.setMinimumWidth(300);
imageView.setMinimumHeight(200);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

これが必要だった。setScaleTypeはおこのみで。

クリックイベントにも注目。

// クリックイベント
imageView.setOnClickListener(new View.OnClickListener() {

			public String url;

			public View.OnClickListener setUrl(String url) {
				this.url = url;
				return this;
			}

			public void onClick(View v) {
				// イメージ画像がクリックされたときに実行される処理
				Log.d(TAG, "url= " + url);

				// 画面遷移
				Intent intent = new Intent(context, TSUGINO_GAMEN.class);
				intent.putExtra("photoUrlAddress", url);
				context.startActivity(intent);

			}
		}.setUrl(url)
);

setUrlを使ってurlをイベントリスナー内に入れ込んでいる。イベントに値を渡す方法。少し凝ったことをしたいなら必要になってくるだろう。

BASIC認証は使わないだろうからはずしてもいいじゃろう。

// BASIC認証
mImageLoader = new BasicAuthImageLoader(mQueue, new ImageLoader.ImageCache() {
	private final LruCache&lt;String, Bitmap&gt; mCache = new LruCache&lt;String, Bitmap&gt;(100);

	public void putBitmap(String url, Bitmap bitmap) {
		mCache.put(url, bitmap);
	}

	public Bitmap getBitmap(String url) {
		return mCache.get(url);
	}
});