端末内に保存されている画像を取得して、gridViewを使ってサムネイル表示するコードを書きましたが、画像が多くなると、取得に時間がかかり、表示までかなり待たされる状態です。
スレッドを使って、画像を取得しながら同時に取得した画像を表示していくコードに書きかえたいと思っていますが、うまくコードにおとせません。
詳しい方がいらっしゃいましたらご教授お願いします。
MainActivity.java
package com.example.xx.gridlayout_3;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity implements AdapterView.OnItemClickListener {
private GridView mGridView = null; private List<String> imagePaths = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGridView = (GridView)findViewById(R.id.gridView1); //グリッド4列表示 mGridView.setNumColumns(4); //表示する画像を取得(DBへアクセス) Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; //SDカード //queryメソッドでカーソルを取得 Cursor cursor = getContentResolver().query(uri, null, null, null, null); ContentResolver cr = getContentResolver(); ArrayList<Bitmap> lstBitmap = new ArrayList<Bitmap>(); //カーソルの一番目に移動 cursor.moveToFirst(); for (int i = 0; i < cursor.getCount(); i++){ //画像iD取得 long id = cursor.getLong(cursor.getColumnIndexOrThrow("_id")); //画像パスを取得 imagePaths.add(cursor.getString(1)); //サムネイルを取得 Bitmap bmp = MediaStore.Images.Thumbnails.getThumbnail(cr, id, MediaStore.Images.Thumbnails.MICRO_KIND, null); lstBitmap.add(bmp); cursor.moveToNext();
// System.out.println(imagePaths);
} //アダプター作成 BitmapAdapter adapter = new BitmapAdapter(getApplicationContext(), lstBitmap); //グリッドにアダプタを設定 mGridView.setAdapter(adapter); //画像をクリックしたときの処理 mGridView.setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> parent,View v,int position,long id){ Intent intent = new Intent(this.getApplicationContext(),SubActivity.class); String selectedImagePath = imagePaths.get(position); //「position」を、"imagePath"をキーワードにしてインテントにセット intent.putExtra("imagePath",selectedImagePath); //アクティビティをスイッチ startActivity(intent); }
}
BitmapAdapter.java
package com.example.xx.gridlayout_3;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.Image;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import java.util.List;
/**
- Created by xx on 2015/12/16.
*/
/"implements Runnable"を追加/
public class BitmapAdapter extends ArrayAdapter<Bitmap> /*implements Runnable */{
//GridView内で画像を表示するために作成したレイアウト private static final int RESOURCE_ID = R.layout.grid_item; private LayoutInflater mInflater; public BitmapAdapter(Context context, List<Bitmap> objects) { super(context, RESOURCE_ID, objects); mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); }
// @Override
//public void run() {
@Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(RESOURCE_ID, null); } ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView); imageView.setImageBitmap(getItem(position)); return convertView; }
//}
}
SubActivity.java
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
/**
- Created by xx on 2015/12/16.
*/
public class SubActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
Intent intent = getIntent(); String imagePath = intent.getStringExtra("imagePath"); ImageView imageView = (ImageView)findViewById(R.id.selectedImage); Bitmap bmp = BitmapFactory.decodeFile(imagePath); imageView.setImageBitmap(bmp); }
}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。