Одна из областей, в которых вы идете не так, как надо, или излишне усложняете дела, находится в вашем onItemClick Listsner.
Следующий ответ является рабочим примером, в котором используется адаптер Cursor ( SimpleCursorAdapter ) и показаны оба столбца Itemname и Itemprice. Кроме того, нажатие на элемент Toast все значения и длительный щелчок удаляют элемент и обновляют ListView.
Однако для адаптеров курсора требуется имя столбца _id , и он ожидает, что это будет значение столбца rowid . Столбец rowid - это специальный столбец, который однозначно идентифицирует строку, но обычно скрыт. Запрос в коде, который возвращает Cursor (метод getAllData2 ), использует это (в основном, выбранный SQL - SELECT rowid AS _id, * FROM the_table
).
Так как основным источником является Курсор, позиционированный Курсор доступен для вас и, следовательно, все значения. Так что вам не нужно искать, вы просто получаете значения из курсора. Дополнительным 4-м параметром для onItemClick / onItemLongClick является значение в столбце _id ( rowid ), и его можно использовать для поиска конкретной строки (в примере onItemLongClick использует это для удаление строки).
Помощник по базам данных DBHelper.java : -
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSION = 1;
public static final String Tname = "mytable";
public static final String COL_ITEMNAME = "itemname";
public static final String COL_ITEMPRICE = "itemprice";
String crt_tbl = "CREATE TABLE IF NOT EXISTS " + Tname + "(" +
COL_ITEMNAME + " TEXT UNIQUE," +
COL_ITEMPRICE + " REAL DEFAULT 0.0" +
")";
public DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(crt_tbl);
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
}
public long addItem(String itemname, Double itemprice) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COL_ITEMNAME,itemname);
cv.put(COL_ITEMPRICE, itemprice);
return db.insert(Tname,null,cv);
}
//<<<<<<<<<< NOT USED
public Cursor getAllData1() {
SQLiteDatabase db = this.getWritableDatabase();
return db.rawQuery("select * from " + Tname, null);
}
//<<<<<<<<<< ALTERNATIVE USED
public Cursor getAllData2() {
SQLiteDatabase db = this.getWritableDatabase();
String[] columns = new String[]{"rowid AS " + BaseColumns._ID,"*"}; //<<<<<<<<<< see Note below
return db.query(Tname,columns,null,null,null,null,null);
}
public int deleteItemByRowid(long id) {
String whereclause = "rowid" + "=?";
String[] whereargs = new String[]{String.valueOf(id)};
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(Tname,whereclause,whereargs);
}
}
- Примечание. BaseColumns._ID преобразуется в _id , поэтому
String[] columns = new String[]{"rowid AS " + BaseColumns._ID,"*"};
создает массив строк из 2 элементов, первый элемент которого имеет rowid AS _id
, второй - *
(все столбцы).
MainActivity.java : -
public class MainActivity extends AppCompatActivity {
ListView mListView;
DBHelper mydb;
Cursor mCsr;
SimpleCursorAdapter mSCA;
Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
mListView = this.findViewById(R.id.listview);
mydb = new DBHelper(this);
addSomeDataForTesting(); //<<<<<<<<<< Add some test data
doListView(); //<<<<<<<<<< setup the listview
}
private void doListView() {
mCsr = mydb.getAllData2();
if (mSCA == null) {
mSCA = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_2,
mCsr,
new String[]{
DBHelper.COL_ITEMNAME,
DBHelper.COL_ITEMPRICE
},
new int[]{
android.R.id.text1,
android.R.id.text2
},
0
);
mListView.setAdapter(mSCA);
// Set the onItemClick Listener
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(mContext,
"You clicked on " + mCsr.getString(mCsr.getColumnIndex(DBHelper.COL_ITEMNAME)) +
". The Price is " + String.valueOf(mCsr.getDouble(mCsr.getColumnIndex(DBHelper.COL_ITEMPRICE))) +
". The rowid is " + String.valueOf(mCsr.getLong(mCsr.getColumnIndex(BaseColumns._ID))) +
". Alternately the rowid is " + String.valueOf(l), //<<<<<<<<<< l is the value of the column _id
Toast.LENGTH_SHORT
).show();
}
});
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
mydb.deleteItemByRowid(l); //<<<<<<<<< uses the value of the 4th parameter passed which is the value of the _id column (which should be the rowid)
doListView();
return true;
}
});
} else {
mCsr = mydb.getAllData2();
mSCA.swapCursor(mCsr);
}
}
private void addSomeDataForTesting() {
if (DatabaseUtils.queryNumEntries(mydb.getWritableDatabase(),DBHelper.Tname) < 1) {
mydb.addItem("Item 1",25.55);
mydb.addItem("Item 2",50.99);
mydb.addItem("Item 3", 125.35);
}
}
}