Obtener el cursor correcto en CustomCursor Adapater getView ()

Tengo un adaptador de cursor personalizado donde cada fila consta de una casilla de verificación, vista de texto y botón. El botón se establece inicialmente como GONE, cuando el usuario selecciona la casilla de verificación Quiero que se muestre el botón para que el usuario pueda hacer clic en él y eliminar la fila correspondiente.

Mi problema es que en mi getView () no puedo obtener el cursor correcto, así que sigue obteniendocursorOutOfBoundsExceptions.

También quiero eliminar el bindView () si ya no lo necesito.

<code>public class DeleteCampaignCustomCursorAdapater extends CursorAdapter {

protected static final String TAG = null;
DatabaseHelper myDbHelper;
protected SQLiteDatabase db;
private final Activity context;

private LayoutInflater mInflater;
protected ListView mListView;

private Cursor c;
public static int[] checked;

TextView merchantNameView;
Button deleteButton;
CheckBox selectForDelete;
//ImageView moveButton;

public DeleteCampaignCustomCursorAdapater(Context context, Cursor c) {
    super(context, c);
    this.context = (Activity) context;
    mInflater = LayoutInflater.from(context);
    this.c = c;
    initializeChecked();
}

@Override
public void bindView(View view, Context context, final Cursor cursor) {

    /*myDbHelper = new DatabaseHelper(context); //Links to DatabaseHelper class

    merchantNameView = (TextView) view.findViewById(R.id.deleteMerchantNameView);
    deleteButton = (Button) view.findViewById(R.id.deleteButton);
    //selectForDelete = (CheckBox) view.findViewById(R.id.deleteCheckBox);
    //moveButton = (ImageView) view.findViewById(R.id.moveButton);

    merchantNameView.setText(cursor.getString(cursor.getColumnIndex("merchantName")));

    final int  rowID = cursor.getInt(cursor.getColumnIndex("_id"));     
    //final long rowID = mListView.getSelectedItemId();

    if (checked[rowID] == 0) {
        selectForDelete.setChecked(false);
    } else {
        selectForDelete.setChecked(true);
    }


    selectForDelete.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if ( isChecked )
            {
               // Make deleteButton appear 
               RelativeLayout ll = (RelativeLayout) buttonView.getParent();
               deleteButton = (Button) ll.findViewById(R.id.deleteButton);
               checked[rowID] = 1;
               deleteButton.setVisibility(0);
            }
            else {
                //Hide deleteButton
                RelativeLayout ll = (RelativeLayout) buttonView.getParent();
                deleteButton = (Button) ll.findViewById(R.id.deleteButton);
                checked[rowID] = 1;
                deleteButton.setVisibility(8);
            }
        }
    });

    deleteButton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {

            if(rowID > 0) {
                //Log.d(TAG, "Button Click. rowID = "+rowID);                   

                myDbHelper.deleteRecordWithID(rowID);
                cursor.requery();
                notifyDataSetChanged();
                initializeChecked();  // re-set the checked array
            }                           
        }
    }); */
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return mInflater.inflate(R.layout.delete_campaign_row_layout, null);
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    myDbHelper = new DatabaseHelper(context); //Links to DatabaseHelper class

    if (convertView == null) {
        mInflater = context.getLayoutInflater();
        convertView = mInflater.inflate(R.layout.delete_campaign_row_layout, null);
    }       

    merchantNameView = (TextView) convertView.findViewById(R.id.deleteMerchantNameView);
    deleteButton = (Button) convertView.findViewById(R.id.deleteButton);
    selectForDelete = (CheckBox) convertView.findViewById(R.id.deleteCheckBox);     

    merchantNameView.setText(c.getString(c.getColumnIndex("merchantName")));

    final int  rowID = c.getInt(c.getColumnIndex("_id"));       
    //final long rowID = mListView.getSelectedItemId();

    if (checked[position] == 0) {
        selectForDelete.setChecked(false);
    } else {
        selectForDelete.setChecked(true);
    }

    selectForDelete.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if ( isChecked )
            {
               // Make deleteButton appear 
               RelativeLayout ll = (RelativeLayout) buttonView.getParent();
               deleteButton = (Button) ll.findViewById(R.id.deleteButton);
               checked[position] = 1;
               deleteButton.setVisibility(0);
            }
            else {
                //Hide deleteButton
                RelativeLayout ll = (RelativeLayout) buttonView.getParent();
                deleteButton = (Button) ll.findViewById(R.id.deleteButton);
                checked[position] = 1;
                deleteButton.setVisibility(8);
            }
        }
    });

    deleteButton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {

            if(rowID > 0) {
                //Log.d(TAG, "Button Click. rowID = "+rowID);                   

                myDbHelper.deleteRecordWithID(rowID);
                c.requery();
                notifyDataSetChanged();
                initializeChecked();  // re-set the checked array
            }                           
        }
    });

    return convertView;     
}

public void initializeChecked() {
    checked = new int[c.getCount()];
    int i = 0;
    while (i < c.getCount()) {
        checked[i] = 0;
        i++;
    }
}
</code>

}

Logcat:

<code>05-12 00:36:23.232: W/KeyCharacterMap(15777): Can't open keycharmap file
05-12 00:36:23.232: W/KeyCharacterMap(15777): Error loading keycharmap file '/system/usr/keychars/synaptics-rmi-touchscreen.kcm.bin'. hw.keyboards.65537.devname='synaptics-rmi-touchscreen'
05-12 00:36:23.232: I/KeyCharacterMap(15777): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
05-12 00:36:23.332: D/WindowManagerImpl(15777): addView, new view, mViews[1]: com.android.internal.policy.impl.PhoneWindow$DecorView@4053e328
05-12 00:36:23.903: D/View(15777): onTouchEvent: viewFlags: 0x18005001
05-12 00:36:23.903: D/View(15777): onTouchEvent: isFocusable: true, isFocusableInTouchMode: false, isFocused: false; focusTaken: false
05-12 00:36:23.913: D/WindowManagerImpl(15777): finishRemoveViewLocked, mViews[1]: com.android.internal.policy.impl.PhoneWindow$DecorView@4053e328
05-12 00:36:23.973: D/Database(15777): dbopen(): path = /data/data/com.roardog.FidelrBasic/databases/Fidelr_memory, flag = 6, file size = 5120
05-12 00:36:23.973: D/Database(15777): dbopen(): path = /data/data/com.roardog.FidelrBasic/databases/Fidelr_memory, mode: wal, disk free size: 253 M, handle: 0x387968
05-12 00:36:23.983: D/ATRecorder(15777): com.htc.autotest.dlib.RecordEngine in loader dalvik.system.DexClassLoader@40550268
05-12 00:36:23.983: D/WindowManagerImpl(15777): addView, new view, mViews[1]: com.android.internal.policy.impl.PhoneWindow$DecorView@40548d90
05-12 00:36:23.993: D/AndroidRuntime(15777): Shutting down VM
05-12 00:36:23.993: W/dalvikvm(15777): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)
05-12 00:36:24.023: E/AndroidRuntime(15777): FATAL EXCEPTION: main
05-12 00:36:24.023: E/AndroidRuntime(15777): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:585)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at com.roardog.FidelrBasic.DeleteCampaignCustomCursorAdapater.getView(DeleteCampaignCustomCursorAdapater.java:125)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.widget.AbsListView.obtainView(AbsListView.java:1449)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1265)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.widget.ListView.onMeasure(ListView.java:1128)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.view.View.measure(View.java:8553)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3261)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.view.View.measure(View.java:8553)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3261)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.view.View.measure(View.java:8553)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3261)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.view.View.measure(View.java:8553)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.view.ViewRoot.performTraversals(ViewRoot.java:915)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1991)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.os.Looper.loop(Looper.java:150)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at android.app.ActivityThread.main(ActivityThread.java:4385)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at java.lang.reflect.Method.invokeNative(Native Method)
05-12 00:36:24.023: E/AndroidRuntime(15777):    at java.lang.reflect.Method.invoke(Method.java:507)
</code>

05-12 00: 36: 24.023: E / AndroidRuntime (15777): com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:849) 05-12 00: 36: 24.023: E / AndroidRuntime ( 15777): en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:607) 05-12 00: 36: 24.023: E / AndroidRuntime (15777): en dalvik.system.NativeStart.main (Método nativo) 05-12 00: 36: 25.304: D / Proceso (15777): killProcess, pid = 15777 05-12 00: 36: 25.304: D / Proceso (15777): dalvik.system.VMStack.getThreadStackTrace (Método nativo) 05- 12 00: 36: 25.304: D / Process (15777): java.lang.Thread.getStackTrace (Thread.java:745) 05-12 00: 36: 25.304: D / Process (15777): android.os.Process. killProcess (Process.java:797) 05-12 00: 36: 25.304: D / Process (15777): com.android.internal.os.RuntimeInit $ UncaughtHandler.uncaughtException (RuntimeInit.java:108) 05-12 00:36 : 25.304: D / Process (15777): java.lang.ThreadGroup.uncaughtException (ThreadGroup.java:854) 05-12 00: 36: 25.314: D / Process (15777): java.lang.ThreadGroup.uncaughtException (ThreadGroup. java: 851) 05-12 00: 3 6: 25.314: D / Proceso (15777): dalvik.system.NativeStart.main (Método nativo) 05-12 00: 36: 25.314: I / Proceso (15777): Señal de envío. PID: 15777 SIG: 9

SOLUCIÓN DE TRABAJO FINAL

<code>public class DeleteCampaignCustomCursorAdapater extends CursorAdapter {

protected static final String TAG = null;
DatabaseHelper myDbHelper;
protected SQLiteDatabase db;
private final Activity context;

private LayoutInflater mInflater;
protected ListView mListView;

private Cursor c;
public static int[] checked;

TextView merchantNameView;
Button deleteButton;
CheckBox selectForDelete;
//ImageView moveButton;

public DeleteCampaignCustomCursorAdapater(Context context, Cursor c) {
    super(context, c);
    this.context = (Activity) context;
    mInflater = LayoutInflater.from(context);
    this.c = c;
    c.moveToFirst();
    initializeChecked();
}

@Override
public void bindView(View view, Context context, final Cursor cursor) {     

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return mInflater.inflate(R.layout.delete_campaign_row_layout, null);
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    c.moveToPosition(position);

    myDbHelper = new DatabaseHelper(context); //Links to DatabaseHelper class

    if (convertView == null) {
        mInflater = context.getLayoutInflater();
        convertView = mInflater.inflate(R.layout.delete_campaign_row_layout, null);
    }       

    merchantNameView = (TextView) convertView.findViewById(R.id.deleteMerchantNameView);
    deleteButton = (Button) convertView.findViewById(R.id.deleteButton);
    selectForDelete = (CheckBox) convertView.findViewById(R.id.deleteCheckBox);     

    merchantNameView.setText(c.getString(c.getColumnIndex("merchantName")));

    final int  rowID = c.getInt(c.getColumnIndex("_id"));

    if (checked[position] == 0) {
        selectForDelete.setChecked(false);
    } else {
        selectForDelete.setChecked(true);
    }

    selectForDelete.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if ( isChecked )
            {
               // Make deleteButton appear 
               RelativeLayout ll = (RelativeLayout) buttonView.getParent();
               deleteButton = (Button) ll.findViewById(R.id.deleteButton);
               checked[position] = 1;
               deleteButton.setVisibility(0);
            }
            else {
                //Hide deleteButton
                RelativeLayout ll = (RelativeLayout) buttonView.getParent();
                deleteButton = (Button) ll.findViewById(R.id.deleteButton);
                //checked[position] = 1;
                deleteButton.setVisibility(8);
            }
        }
    });

    deleteButton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {

            if(rowID > 0) {
                //Log.d(TAG, "Button Click. rowID = "+rowID);                   

                myDbHelper.deleteRecordWithID(rowID); //Call deleteRecord on selected row
                c.requery(); //requery the cursor
                notifyDataSetChanged(); //notify the view the data set has changed 
                initializeChecked();  // re-set the checked array
            }                           
        }
    });

    return convertView;     
}

public void initializeChecked() {
    checked = new int[c.getCount()];
    int i = 0;
    while (i < c.getCount()) {
        checked[i] = 0;
        i++;
    }
}
</code>

}

Respuestas a la pregunta(1)

Su respuesta a la pregunta