我的ListViewItems中有删除按钮。从这些按钮的点击事件我想显示一个确认对话框,然后通过数据库中的ID删除项目。 ID存储在项目的ViewHolder中。
如何从AlertDialog的点击处理程序访问项目的ViewHolder?这是相关的代码。编译器在onClick内部的“V”上扼流圈(DialogInterface对话框,int whichButton)。
我可以将ID存储在按钮的标签中,但这感觉很尴尬。
我的目标是最低API级别8,但请告诉我更高的API级别是否有解决方案。这是我的第一个Android程序,所以很可能是一个明显的解决方案。
private static class MyAdapter extends CursorAdapter {
//.....
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = View.inflate(context, R.layout.my_detail, null);
MyViewHolder holder = new MyViewHolder();
holder.deleteButton = (Button) view.findViewById(R.id.deleteButton);
holder.deleteButton.setOnClickListener(deleteButtonClickListener);
holder.editButton = (Button) view.findViewById(R.id.editButton);
holder.editButton.setOnClickListener(editButtonClickListener);
holder.nameTextView = (TextView) view
.findViewById(R.id.nameTextView);
holder.itemId = cursor.getLong(cursor
.getColumnIndex(MyData.ID_COLUMN));
view.setTag(holder);
return view;
} // newView()
//.....
private OnClickListener deleteButtonClickListener = new OnClickListener() {
public void onClick(View v) {
new AlertDialog.Builder(_context)
.setTitle("Delete?")
.setMessage("Delete item?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
MyViewHolder holder = (MyViewHolder) ((View) v
.getParent()).getTag();
long itemId = holder.itemId;
_MyData.deleteItem(itemId);
}
}).setNegativeButton(android.R.string.no, null)
.show();
} // onClick()
}; // deleteButtonClickListener
//.....
}
答案 0 :(得分:1)
您的代码实际上看起来非常好,唯一需要做的更改是v
需要声明final
,如下所示:
private OnClickListener deleteButtonClickListener = new OnClickListener()
{
public void onClick(final View v) { }
}
原因在于Java如何实现闭包。 v
应为final
,以便我们DialogInterface.OnClickListener
中setPositiveButton()
的实施权限可以访问该变量。
答案 1 :(得分:0)
在“删除”按钮中标记itemid,以便您可以在对话框中检索它
E.g
holder.deleteButton.setTag(cursor.getLong(cursor
.getColumnIndex(MyData.ID_COLUMN)));
并在对话框中检索
long itemId = v.getTag();
答案 2 :(得分:0)
first implement the onclickevtn
private static class MyAdapter extends CursorAdapte mplements android.view.View.OnClickListener
then set the event for particular
holder.editButton.setOnClickListener(this);
then override the class function
@Override
public void onClick(View v) {
if(R.id.editButton==v.getId()){
....do something
}else
}
this will work after struggling i got this way