2012-03-02 4 views
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(); 
} 
} 
+0

私は必要なすべてのデータを受け取ったことを確認した後、Cursor.close()を呼び出すか、私のカーソルのcloseメソッドを呼び出すclose()というBaseAdapterサブクラスでラッパーメソッドを作成します。私はあなたのアプリやBaseAdapterサブクラスをどのように設定したのかよくわからないので、それ以上は助けません。 –

+0

これはどのようにこのカーソルを取得するかによって異なります... ConetntProviderの場合、http://developer.android.com/reference/android/content/CursorLoader.htmlを使用できます。それ以外の場合は、アクティビティ – Selvin

+0

のonDestroyでカーソルを閉じることができます@SelvinカーソルオブジェクトはBaseAdapterのサブクラスに対してローカルで、そのアダプタに関連付けられているアクティビティのonDestroyでどのように閉じますか? –

答えて

0

あなたが独占的にclose()メソッドを呼び出していないので、これが起こっています。

アダプタのgetView()メソッドでimageViewを返す前に実行し、s.close()を削除します。sはアダプタであり、カーソルではありません。

関連する問題