3

我的 ListViewItems 中有删除按钮。从这些按钮的点击事件中,我想在通过数据库中的 ID 删除项目之前显示一个确认对话框。ID 存储在项目的 ViewHolder 中。

如何从 AlertDialog 的单击处理程序访问项目的 ViewHolder?这是相关的代码。编译器在 onClick(DialogInterface dialog, int whichButton) 内的“V”上阻塞。

我可以将 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
//.....
}
4

3 回答 3

1

您的代码实际上看起来不错,唯一需要的更改是v需要声明final,如下所示:

private OnClickListener deleteButtonClickListener = new OnClickListener()
{
    public void onClick(final View v) { }
}

原因在于 Java 如何实现闭包。v应该final这样我们的DialogInterface.OnClickListenerin the实现setPositiveButton()就可以访问该变量。

于 2012-11-12T17:16:01.580 回答
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
于 2014-08-20T12:17:54.010 回答
0

在删除按钮中标记 itemid,以便您可以在对话框中检索它

例如

holder.deleteButton.setTag(cursor.getLong(cursor
                .getColumnIndex(MyData.ID_COLUMN)));

并在对话框中检索它

long itemId = v.getTag();
于 2012-11-12T17:22:04.357 回答