如何在ListViewItem的按钮单击中创建AlertDialog时从AlertDialog的单击处理程序获取ListViewItem的ViewHolder?

时间:2012-11-12 17:10:18

标签: android listview android-alertdialog

我的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
//.....
}

3 个答案:

答案 0 :(得分:1)

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

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

原因在于Java如何实现闭包。 v应为final,以便我们DialogInterface.OnClickListenersetPositiveButton()的实施权限可以访问该变量。

答案 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