2012-05-11 8 views
5

Ho un adattatore cursore personalizzato in cui ogni riga è composta da una casella di controllo, una visualizzazione di testo e un pulsante. Il pulsante è inizialmente impostato su GONE, quando l'utente seleziona la casella di controllo Voglio che il pulsante venga visualizzato in modo che l'utente possa selezionarlo e cancellare la riga corrispondente.Ottieni cursore corretto in CustomCursor Adapater getView()

Il mio problema è che nel mio getView() non riesco a ottenere il cursore corretto, quindi continua a ricevere cursorOutOfBoundsExceptions.

Voglio anche rimuovere il bindView() se non ne ho più bisogno.

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++; 
    } 
} 

}

Logcat:

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]: [email protected] 
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]: [email protected] 
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 [email protected] 
05-12 00:36:23.983: D/WindowManagerImpl(15777): addView, new view, mViews[1]: [email protected] 
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) 

05-12 00: 36: 24,023: E/AndroidRuntime (15777): a com.android.internal.os.ZygoteInit $ MethodAndArgsCaller. run (ZygoteInit.java:849) 05-12 00: 36: 24.023: E/AndroidRuntime (15777): a com.android.internal.os.ZygoteInit.main (ZygoteInit.java:607) 05-12 00: 36: 24.023: E/AndroidRuntime (15777): su dalvik.system.NativeStart.main (metodo nativo) 05-12 00: 36: 2 5.304: D/Process (15777): killProcess, pid = 15777 05-12 00: 36: 25.304: D/Process (15777): dalvik.system.VMStack.getThreadStackTrace (metodo 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 (Processo. 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: 36: 25.314: D/Process (15777): dalvik.system.NativeStart.main (metodo nativo) 05-12 00 : 36: 25.314: I/Process (15777): invio del segnale. PID: 15777 SIG: 9

FINALE DI LAVORO SOLUZIONE

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++; 
    } 
} 

}

+0

puoiaffiggere il LogCat per favore? Ci sono diverse chiamate al cursore, è necessario sapere quale sta bombardando. – Barak

+0

In base a questo http://stackoverflow.com/questions/3535074/getview-vs-bindview-in-a-custom-cursoradapter Non sembra che si debba usare getView() con un 'CustomCursorAdapter', ma lì deve essere un modo per ottenere la posizione con 'bindView()' o 'newView()' – Roardog

+0

Quale riga è DeleteCampaignCustomCursorAdapater.java:125? – Barak

risposta

4

Aggiungi c.moveToFirst(); al costruttore prima di initializeChecked();.

EDIT

prima cosa nella vostra GetView aggiungere questo:

c.moveToPosition(position); 
+0

Rimuove l'errore ma ora tutte le campagne si presentano come la prima. Sembra che il cursore non si sposti nella posizione successiva, quindi ho bisogno di mettere 'c.moveToNext()' da qualche parte ... – Roardog

+0

No, è necessario impostare la posizione del cursore quando si entra in getView. Aggiornato la mia risposta. – Barak

+0

Grazie amico, mi hai davvero aiutato! – Roardog

Problemi correlati