Android 从自定义ListAdapter创建和显示AlertDialog

Android 从自定义ListAdapter创建和显示AlertDialog,android,listview,android-alertdialog,Android,Listview,Android Alertdialog,我正在实现一个自定义ListAdapter,它使用不同的列表项布局来显示一些项。从这个自定义ListAdapter中,我实际上想在单击特定按钮时显示一个AlertDialog。我实现了onCreateDialog(int)方法,并尝试使用showDialog(int)来显示对话框。但该对话框不会显示在活动中 这是我的自定义listadapter文件 import android.app.Activity; import android.app.AlertDialog; import andro

我正在实现一个自定义ListAdapter,它使用不同的列表项布局来显示一些项。从这个自定义ListAdapter中,我实际上想在单击特定按钮时显示一个AlertDialog。我实现了onCreateDialog(int)方法,并尝试使用showDialog(int)来显示对话框。但该对话框不会显示在活动中

这是我的自定义listadapter文件


import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class AddProblemsLayoutAdapter extends BaseAdapter {

    private Activity mContext;
    private static final int TYPE_TITLE = 0;
    private static final int TYPE_TAG = 1;
    private static final int TYPE_SOLUTION = 2;
    private static final int LAYOUT_MAX_COUNT = TYPE_SOLUTION + 1;
    private static final int ADD_TAG_DIALOG = 3378;
    private static int ITEM_COUNT = 4;
    private static Button addSolution = null, addTag = null;
私人活动mContext;
私有静态最终整数类型\u TITLE=0;
私有静态最终整数类型_标记=1;
私有静态最终int类型_解决方案=2;
私有静态最终整数布局\u最大\u计数=类型\u解决方案+1;
私有静态最终int ADD_TAG_DIALOG=3378;
私有静态整数项_计数=4;
私有静态按钮addSolution=null,addTag=null;
public AddProblemsLayoutAdapter(活动文本){
mContext=aContext;
}
@凌驾
public int getViewTypeCount(){
返回布局\u最大\u计数;
}
受保护的对话框onCreateDialog(int id){
AlertDialog=null;
AlertDialog.Builder=新建AlertDialog.Builder(mContext);
开关(id){
案例添加标签对话框:
setMessage(“您确定要退出吗?”)。可设置为取消(
错误)。设置正按钮(“是”,
新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface对话框,int-id){
}
}).setNegativeButton(“否”,
新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface对话框,int-id){
dialog.cancel();
}
});
dialog=builder.create();
打破
违约:
dialog=null;
}
dialog.setOwnerActivity(mContext);
返回对话框;
}
@凌驾
public int getItemViewType(int位置){
如果(位置<2)
返回类型\标题;
其他的
返回位置>2?类型\解决方案:类型\标签;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
int type=getItemViewType(位置);
if(convertView==null){
LayoutInflater充气器=mContext.getLayoutInflater();
开关(类型){
案例类型和标题:
convertView=充气机。充气(R.layout.title_行,空);
打破
箱子类型标签:
convertView=充气机。充气(R.layout.tag_行,空);
打破
案例类型\u解决方案:
convertView=充气机。充气(R.layout.solution_行,空);
打破
}
}
如果(位置==0){
TextView titleText=(TextView)convertView
.findViewById(R.id.titleText);
titleText.setText(R.string.title_string);
}否则如果(位置==1){
TextView titleText=(TextView)convertView
.findViewById(R.id.titleText);
titleText.setText(R.string.description_string);
}否则如果(位置==2){
addTag=(按钮)convertView.findViewById(R.id.addProblemTag);
addTag.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mContext.showDialog(添加标签对话框);
Toast.makeText(mContext,“添加标记”,Toast.LENGTH\u LONG)
.show();
}
});
}否则如果(位置==3){
addSolution=(按钮)convertView.findViewById(R.id.addSolution);
addSolution.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
项目计数++;
notifyDataSetChanged();
}
});
}
返回视图;
}
@凌驾
public int getCount(){
退货项目数量;
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}
}


有谁能给我一些关于如何在点击按钮时显示AlertDialog对话框的提示。

它不起作用,因为
onCreateDialog
属于
活动
类。您不应该在适配器中执行任何操作,而应该管理数据。也就是说,将
onCreateDialog
放在您的活动中,然后从那里调用它(当然,使用
showDialog
方法:)


您向其中一个按钮添加了单击侦听器;因此,您要做的是向活动发送一个回调,以便它调用
showDialog
方法。

如果您使用上下文调用
showDialog
,那么您可能需要在
活动中定义
onCreateDialog
对话框,而不是在适配器中定义该对话框。

您可以使用
材料设计库
。这也将从BaseAdapters和ListAdapters工作。请在这里检查

在CustomAdapter类中,您向ListView声明了变量mContext和ArrayList数据

ArrayList<String> datasource;
Context mContext;
现在您有了一个上下文,请使用声明要替换的变量mContext

"getContext()", "v.getContext()"

现在,当您单击CustomAdapter中的按钮时,您可以烤面包或显示任何对话框。享受你的代码

谢谢,这很有效。我只是有个小问题。文档中说明,您可以在非onCreateDialog的函数中定义对话框的创建,然后在“设置所有者”活动中定义对话框的创建。这可以通过在我的适配器中有一个自定义函数(虽然我现在知道不建议使用:)然后在setOwnerActivity(Activity)中设置显示对话框的活动来实现吗?实际上,您可以根据需要创建对话框
onCreateDialog
非常有用,因为它将为您处理配置更改。。。但是你可以在任何你想要的地方使用对话框。。。只需创建它并调用其
show
方法。感谢您的帮助。我只是有个小问题。文档说明您可以定义cre
 public AdapterAudio(Context mContext, ArrayList<String> data) {
    super();
    this.datasoure = data;
    this.mContext = mContext;
}
CustomAdapter adapter = new CustomAdapter(Activity_Main.this, listAudio_hienthi10);
"getContext()", "v.getContext()"