我总是无法删除前两个有时三个记录。它们在Listview上,当您按下元素时,您将在另一个布局上看到删除按钮。在Log im中获取每个元素的正确索引。
所以这是我的代码:
主要活动:
viewOfT.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i=new Intent(MainActivity.this, popupWindow.class);
i.putExtra("index",id);
startActivity(i);
}
});
}
public void populateListView() {
Cursor data = db.getData();
ArrayList<String> listData = new ArrayList<>();
while(data.moveToNext()){
k.setId(data.getInt(0));
k.setTask(data.getString(1));
listData.add("- " + k.getTask());
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
listData);
viewOfT.setAdapter(arrayAdapter);
arrayAdapter.notifyDataSetChanged();
viewOfT.invalidateViews();
其他活动中的删除按钮:
del.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Bundle bundle=getIntent().getExtras();
long value=bundle.getLong("index");
db.deleteRecord(value);
finish(); }
});
和SQLHelper:
public void deleteRecord(long id) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_NAME, KEY_ID + "=" + id, null);
close();
}
答案 0 :(得分:1)
1)删除populateListView
方法
2)将以下内容添加为类变量: -
SimpleCursorAdpater sca;
Cursor data;
3)在onCreate
方法中添加: -
data = getData();
sca = new SimpleCursorAdapter(
this, // Context same as for array adapter
android.R.layout.simple_list_item_1, // layout to be used
data, // <<<<<<<< the cursor to be used for the list
new String[]{"columnname_to_be_displayed"}, // <<<<<<<< cursor column to display name
new int[android.R.id.text1], // the view into which the cursor data will be placed
0 // a flag 0 is fine
);
viewOfT.setAdapter(arrayAdapter);
4)添加一个新方法来覆盖&#39; onResume&#39;方法(或者如果已经被覆盖则改变它): -
@Override
protected void onResume() {
super.onResume();
data = getData();
sca.swapCursor(); // can you sca.notifyDatasetChanged()
}
onResume
,以便再次从数据库中检索数据(删除的行将不存在),并告知adpater刷新数据。 理想情况下,您还应覆盖onDestroy()
方法以关闭游标(data.close();)
CursorAdapters必须存在一个名为 _id 的游标列(以及SimpleCursorAdapter如何知道传递给onItemClickListener 的内容)。
如果 KEY_ID
不等于 _id ;您需要将KEY_ID
更改为 _id 或修改getData()
方法以包含_id列(应该是行标识符的值),例如假设一个非常基本的查询:
public Cursor getData() {
return db.query(TABLE_NAME,"rowid AS _id, *",null,null,null,null,null);
} // Note! will add an extra column so beware if using column offsets
或者也许: -
public Cursor getData() {
return db.query(TABLE_NAME,KEY_ID + " AS _id, *",null,null,null,null,null);
} // Note! will add an extra column so beware if using column offsets
有关列偏移的说明
在您的代码中,您有: -
k.setId(data.getInt(0));
k.setTask(data.getString(1));
0和1是列偏移(并且可以改变例如两个替代的getData()方法)。因此,通常更好地利用Cursor方法getColumnIndex(columnname)
,例如以上可能是: -
k.setId(data.getInt(data.getColumnIndex(KEY_ID));
k.setTask(data.getString(data.getColumnIndex("TASK_COLUMN")));
请注意!并不是你需要创建一个Array,因为SimpleCursorAdpater将光标作为源。 (KEY_ID可能必须以DatabaseHelper类作为前缀)。