当在ListViewItem的按钮点击事件中创建AlertDialog时,如何从AlertDialog的点击处理程序中获取ListViewItem的ViewHolder?

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
//.....
}
3个回答

1

你的代码看起来非常不错,唯一需要更改的是将v声明为final,像这样:

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

这是由于Java实现闭包的方式所致。变量v应该是final,以便我们在setPositiveButton()中实现DialogInterface.OnClickListener时可以访问该变量。

这会导致“在标记'final'上的语法错误,删除此标记”,编译器无法再识别各种类型。 - Rhyme
糟糕,我打错了。应该在“View”之前加上“final”。 - wsanville

0

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

E.g

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

并在对话框中检索它

long itemId = v.getTag();

我知道:“我可以将ID存储在按钮的标签中,但那感觉很奇怪。” - Rhyme

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接