简而言之,您正在预装一个列表,该列表是从数据库中提取的单个字符串。
您的删除需要两个值。 id 和名称(列出的值)。这两个值都无法从列出的单个字符串中获得。
如果COL2是唯一的(即永远不会使用相同的值),则可以基于此值轻松删除,但名称经常不是唯一的,在这种情况下,将无法从名称中得出ID。您可能必须使用对象的ArrayList(这样的对象同时包含ID和名称),或者具有另一个包含ID的数组,该ID与名称数组同步。
我建议使用CursorAdapter:-
- 迎合游标,最特别地提供 id 作为onItemClick的第四个参数(对于其他适配器,它与第三个参数相同,即position)。
- 已将游标中的所有行用作源。
- 在调用onItemClick(以及onItemLongClick)时,光标是否处于适当的位置。
示例
以下是基于您的代码的示例。
DatabaseHelper.java
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSION = 1;
public static final String DB_TABLE = "mytable";
public static final String COL1 = BaseColumns._ID; //<<<<<<<<<IMPORTANT uses the _id column
public static final String COL2 = "mynamecolumn";
public DatabaseHelper(@Nullable Context context) {
super(context,DBNAME,null,DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + DB_TABLE +
"(" +
COL1 + " INTEGER PRIMARY KEY," +
COL2 + " TEXT " +
")"
);
}
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) {
}
public long insert(String name) {
ContentValues cv = new ContentValues();
cv.put(COL2,name);
return this.getWritableDatabase().insert(DB_TABLE,cv);
}
public int delete(long id) {
SQLiteDatabase db = this.getWritableDatabase();
// ID WILL BE UNIQUE so that's enough to IDentify a row
return db.delete(DB_TABLE,COL1 + "=?",new String[]{String.valueOf(id)});
}
public Cursor viewData() {
SQLiteDatabase db = this.getWritableDatabase();
return db.query(DB_TABLE,null);
}
}
- 上面的内容应与您的但类似,请注意名称 _id (通过常量 BaseColumns._ID 获得) (对于COL1)。
MainActivity.java
public class MainActivity extends AppCompatActivity {
DatabaseHelper bh;
Cursor csr;
ListView lv;
SimpleCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = this.findViewById(R.id.myListView);
bh = new DatabaseHelper(this);
addSomeDataIfNone(); //<<<<< Add some testing data
manageListView(); //<<<<< Manage the LIstView
}
private void manageListView() {
csr = bh.viewData();
if (adapter == null) {
adapter = new SimpleCursorAdapter(
this,android.R.layout.simple_list_item_1,csr,new String[]{DatabaseHelper.COL2},new int[]{android.R.id.text1},0
);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,View view,int position,long id) {
bh.delete(id); //<<<<< uses the 4th parameter
manageListView(); //<<<<< refresh the ListView as the data has changed
}
});
} else {
adapter.swapCursor(csr);
}
}
private void addSomeDataIfNone() {
if(DatabaseUtils.queryNumEntries(bh.getWritableDatabase(),DatabaseHelper.DB_TABLE) > 0) return;
bh.insert("Name 1");
bh.insert("Name 2");
bh.insert("Name 3");
}
@Override
protected void onDestroy() {
csr.close(); // Done with the Cursor so close it
bh.close(); // Done with the Database as this is the Main Activity
super.onDestroy();
}
}
请注意,这与但
非常相似
- 使用 SimpleCursorAdapter 作为ListView的源。 iself使用游标作为数据源。
- 每次查看数据都不会创建新的适配器
- 单击某项并因此将其删除时,将自动刷新ListView。
- 使用 id 删除被单击的项目,因为这是对 id 验证行唯一的全部操作。
结果
首次运行时:-
单击名称2时:-
本文链接:https://www.f2er.com/3114608.html