我不能让这个工作。我希望在单击按钮时删除列表视图中的项目。但我真的不知道如何实现这一点。
这是我的适配器
public class PersonalRecordsAdapterDialog extends CursorAdapter {
public PersonalRecordsAdapterDialog(Context context, Cursor c) {
super(context, c);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.list_view_personal_layout, parent, false);
}
@Override
public void bindView(View view, Context context, final Cursor cursor) {
final DatabaseAdapter db = new DatabaseAdapter(context);
TextView weightTV = (TextView) view.findViewById(R.id.weight_tv);
TextView dateTV = (TextView) view.findViewById(R.id.date_tv);
final Button deleteRecord = (Button) view.findViewById(R.id.delete_record);
final String id = cursor.getString(cursor.getColumnIndex(DatabaseAdapter.DatabaseHelper.COL_1));
String weight = cursor.getString(cursor.getColumnIndex(DatabaseAdapter.DatabaseHelper.COL_3));
String date = cursor.getString(cursor.getColumnIndex(DatabaseAdapter.DatabaseHelper.COL_4));
weightTV.setText(weight);
dateTV.setText(date);
deleteRecord.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
db.remove(Integer.parseInt(id));
notifyDataSetChanged();
}
});
}
}
这是我的ListView
AlertDialog.Builder builder = new AlertDialog.Builder(holder.mContext);
View dialogView = View.inflate(holder.mContext,R.layout.dialog, null);
ListView myList = (ListView) dialogView.findViewById(R.id.dialog_list_view);
Cursor cursor = holder.myDb.getRows(exercise[position]);
PersonalRecordsAdapterDialog adapter = new PersonalRecordsAdapterDialog(holder.mContext,cursor);
myList.setAdapter(adapter);
builder.setView(dialogView)
.setTitle("History of your " + exercise[position].toLowerCase() + " records")
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// sign in the user ...
}
});
AlertDialog b = builder.create();
b.show();
感谢您的帮助
答案 0 :(得分:1)
在onClick
发生时,从同一个适配器调用notifyDatasetChanged()
中删除模型中的项目
并且在您的情况下,您将光标直接传递给自定义适配器,这是一种非常糟糕的做法,因为在这种情况下,您与数据库的连接将保持打开状态并导致内存和数据库问题
因此,您可以创建自己的模型(ArrayList),从游标获取值,将它们添加到模型中,关闭数据库连接并将该模型传递给适配器。并删除特定项目从模型中删除并调用notifyDatasetChanged()
。(注意:从模型中删除只会从列表中删除数据,但不会从db中删除。如果要从数据库中删除该数据,还必须执行删除查询)
为此:当我点击ListView项目时,我不想删除它。我只想在单击ListView项目中的按钮
时删除它转到适配器类..使用OnGetView(...)
方法和onClickListener for the same over there
方法获取对象实例。
要从DB中删除行,您可以使用db表中的唯一ID,如此
public void delete_byID(int id){
sqLiteDatabase.delete(MYDATABASE_TABLE, KEY_ID+"="+id, null);
}
您要删除的表格MYDATABASE_TABLE
。
KEY_ID is the name of the coloumn to put where condition.
id is the unique id associated with the row you want to delete
因此,在这种情况下,您不需要光标删除特定记录
答案 1 :(得分:0)
bindView方法不会因db更改而刷新的原因是: 光标是旧光标的钢。 您需要重新查询数据库获取新游标然后 调用adapter.change游标(passHereTheNewCursor)
答案 2 :(得分:0)
Nitesh添加上述答案 - 要在按钮点击时从列表视图中删除项目,请先1.首先需要从listview的适配器中删除项目,如下所示 -
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Object objToRemove = adapter.getItem([POSITION]);
adapter.remove(objToRemove);
}
}
或2.您可以从arrayList&中删除此项目。调用notifyDataSetChanged()。
但这不会从数据库中删除。你必须为它实现删除查询。
并且如上所述 - 在你的情况下,你将光标直接传递给你的自定义适配器这是一个非常糟糕的做法,因为在这种情况下你与数据库的连接将保持打开状态,并可能导致内存和数据库问题。