2016-02-02 14 views
5

Sto tentando di implementare un listview con la casella di controllo in modo che quando una casella di controllo è selezionata, la riga di elenco verrà rimossa. Sto popolando il listview con un cursore e questo sta funzionando bene e la casella di controllo viene visualizzata.ListView Android con casella di controllo Eliminazione/recupero ID riga

Quello che sto avendo problemi è capire come ottenere il _id della riga della casella che è stata controllata.

Qualcuno mi può mostrare come implementare qualcosa di simile

ListView e CheckBox

 Cursor cursor = db.getAllItems(); 

    //String[] columns = new String[] {db.KEY_NAME, db.KEY_CODE, db.KEY_ROWID}; 
    String[] columns = new String[] {db.KEY_ITEM_NAME, db.KEY_MEASUREMENT, db.KEY_UNIT}; 

    int[] to = new int[] {R.id.ingredientName, R.id.ingredientMeasurement, R.id.ingredientUnit}; 

    final SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(this,R.layout.row4, cursor, columns, to, 0); 

    final ListView shoppingList = (ListView) findViewById(R.id.shoppingList); 
    shoppingList.setAdapter(myCursorAdapter); 


    CheckBox deleteCheck = (CheckBox)findViewById(R.id.checkBox1); 

    deleteCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
      if (isChecked){ 
       // How do I get the list item clicked to delete row? 
      } 
     } 

    }); 

XML - Row.4.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" 
android:weightSum="1"> 

<TextView 
    android:id="@+id/ingredientName" 
    android:layout_width="wrap_content" 
    android:textColor="#000000" 
    android:layout_height="wrap_content" 
    android:padding="5dp" 
    android:hint="wewewe"/> 

<TextView 
    android:id="@+id/ingredientMeasurement" 
    android:textColor="#000000" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@+id/ingredientName" 
    android:padding="5dp" 
    android:hint="fefefef"/> 

<TextView 
    android:id="@+id/ingredientUnit" 
    android:textColor="#000000" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@+id/ingredientMeasurement" 
    android:padding="5dp" 
    android:hint="qqqqq"/> 


<CheckBox 
    android:id="@+id/checkBox1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="right" 
    android:background="#fff" 
    android:text=""/> 
</LinearLayout> 
+0

beh, è ​​possibile creare due metodi per la rimozione di articoli da listview, uno in adattatore e il secondo nel database. 'adapter.remove (item.getId (checkedId));' e chiama il secondo metodo dal database 'dataBase.remove (item.getId (checkedId));' Questo è il modo in cui si eliminerà l'elemento dall'adattatore e dal database. –

+0

Grazie per la risposta, solo una domanda, la funzione 'getId', otterrà il' id' della riga o l'effettivo '_id' nel database? – JJSmith

+0

La funzione 'getId' otterrà l'id specificato dell'oggetto che si sta selezionando in listView. –

risposta

4

Utilizzare questo cursore personalizzato adattatore e maniglia onCheckedChanged qui in questo adattatore.

import android.content.Context; 
import android.database.Cursor; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.SimpleCursorAdapter; 

public class CustomAdapter extends SimpleCursorAdapter implements CompoundButton.OnCheckedChangeListener { 

    private Context mContext; 
    private Context appContext; 
    private int layout; 
    private Cursor cr; 
    private final LayoutInflater inflater; 

    public CustomAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to); 
     this.layout = layout; 
     this.mContext = context; 
     this.inflater = LayoutInflater.from(context); 
     this.cr = c; 
    } 

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

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     super.bindView(view, context, cursor); 
     CheckBox checkBox1 = (CheckBox) view.findViewById(R.id.checkBox1); 
     checkBox1.setOnCheckedChangeListener(this); 
     int columnIndex = cursor.getColumnIndex(your column here); 
     int columnvalue = cursor.getInt(columnIndex); 
     checkBox1.setTag(columnvalue); 

    } 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      int id = (Integer) buttonView.getTag(); 
    } 
} 
+0

Grazie per la risposta, sono un po 'confuso su come implementarlo nell'attività della lista? – JJSmith

+0

stai usando SimpleCursorAdapter, basta sostituirlo con questo CustomAdapter, spero che funzionerà. – Master

+0

Impostare anche i valori per ingredientName, ingredienteMeasurement e ingredientUnit nel metodo bindView e columnValue sarà l'id che si desidera ottenere quando la casella di controllo è selezionata. – Master

Problemi correlati