1
私のアプリでは、gridViewに画像を表示するアクティビティがあります。そこで、BaseAdapterを拡張したAdapterクラスを使用しました。そのアダプタクラスでは、カーソルを開いてgetView()メソッドから画像を返します。終了方法アダプタクラスで開かれたカーソル?
ここで私の質問は、私が例外を受けてどこでカーソルを閉じるべきかということです。 startManagingCursor()は非推奨であるため使用できません。他の解決策は高く評価されます。
私のonCreateメソッド
public void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.splitted_grid);
System.out.println("started new splittedimageactivity");
//splittedBitmaps = getIntent().getParcelableArrayListExtra("splitted_images");
int size = getIntent().getIntExtra("image_numbers", 0);
int width = getIntent().getIntExtra("width", 0);
int height = getIntent().getIntExtra("height", 0);
gridView = (GridView) findViewById(R.id.image_grid_view);
SplittedImageAdapter s = new SplittedImageAdapter(this, size, width, height);
gridView.setAdapter(s);
gridView.setNumColumns((int) Math.sqrt(size));//splittedBitmaps.size()));
s.close();// This causes exception trying to re-open already closed cursor. If I remove this, then exception is your cursor is not closed, call close() explicitly
}
マイアダプタクラス
public class SplittedImageAdapter extends BaseAdapter{
private Context mContext;
//private List<Bitmap> mSplittedBitmaps;
public ViewGroup mParentView = null;
private int noOfImages, imageWidth, imageHeight;
private Cursor mCursor;
public SplittedImageAdapter(Context c, int size, int w, int h){
mContext = c;
noOfImages = size;
imageWidth = w;
imageHeight = h;
DBAdapter db = new DBAdapter(c);
db.open();
mCursor = db.getAllImages();
System.out.println(mCursor+"cursor opened");
}
@Override
public int getCount() {
return noOfImages;//mSplittedBitmaps.size();
}
@Override
public Object getItem(int position) {
return position;//mSplittedBitmaps.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
mParentView = parent;
ImageCell imageView = null;
if(convertView == null){
imageView = new ImageCell(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(imageWidth-4, imageHeight-4));//65,65));//SplittedImageActivity.splittedBitmaps.get(position).getWidth()-4, SplittedImageActivity.splittedBitmaps.get(position).getHeight()-4));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(0, 0, 0, 0);
}else{
imageView = (ImageCell) convertView;
}
imageView.mCellNumber = position;
imageView.mGrid = (GridView) mParentView;
imageView.setId(position);
if(position == noOfImages-1){//SplittedImageActivity.splittedBitmaps.size()-1 == position){
imageView.mEmpty = true;
imageView.setBackgroundResource(R.color.cell_empty);
}
else{
//System.out.println(mCursor.getCount());
mCursor.moveToPosition(position);
Bitmap b = BitmapFactory.decodeFile(mCursor.getString(4));//"/sdcard/Android/data/com.softtrends.puzzle/files/Pictures/image"+position+".jpg");
imageView.setImageBitmap(b);//SplittedImageActivity.splittedBitmaps.get(position));
imageView.mEmpty = false;
}
imageView.setOnClickListener((OnClickListener) mContext);
imageView.setOnLongClickListener((OnLongClickListener) mContext);
return imageView;
}
public void close(){
mCursor.close();
}
}
私は必要なすべてのデータを受け取ったことを確認した後、Cursor.close()を呼び出すか、私のカーソルのcloseメソッドを呼び出すclose()というBaseAdapterサブクラスでラッパーメソッドを作成します。私はあなたのアプリやBaseAdapterサブクラスをどのように設定したのかよくわからないので、それ以上は助けません。 –
これはどのようにこのカーソルを取得するかによって異なります... ConetntProviderの場合、http://developer.android.com/reference/android/content/CursorLoader.htmlを使用できます。それ以外の場合は、アクティビティ – Selvin
のonDestroyでカーソルを閉じることができます@SelvinカーソルオブジェクトはBaseAdapterのサブクラスに対してローカルで、そのアダプタに関連付けられているアクティビティのonDestroyでどのように閉じますか? –