Java 在带有自定义适配器的AlertDialog中单击侦听器
我正在尝试使用自定义列表图像+文本执行AlertDialog。我使用的是自定义适配器,它可以工作,但我不明白onClick事件为什么不能工作。 我已经尝试创建ListView,将适配器设置为它,然后将view设置为AlertDialog,但仍然无法捕获事件。我做错了什么Java 在带有自定义适配器的AlertDialog中单击侦听器,java,android,listview,android-arrayadapter,android-alertdialog,Java,Android,Listview,Android Arrayadapter,Android Alertdialog,我正在尝试使用自定义列表图像+文本执行AlertDialog。我使用的是自定义适配器,它可以工作,但我不明白onClick事件为什么不能工作。 我已经尝试创建ListView,将适配器设置为它,然后将view设置为AlertDialog,但仍然无法捕获事件。我做错了什么 ArrayList<ItemData> list = ItemData.createFromMaterialArray(materials); MaterialsAdapter adapter = n
ArrayList<ItemData> list = ItemData.createFromMaterialArray(materials);
MaterialsAdapter adapter = new MaterialsAdapter(this,
R.layout.custom_material_item, R.id.text, list);
AlertDialog.Builder materialTypesDialog = new AlertDialog.Builder(this);
materialTypesDialog.setTitle(R.string.material);
materialTypesDialog.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Nothing happens, why???
Toast.makeText(context, "WORK", Toast.LENGTH_LONG).show();
}
});
materialTypesDialog.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// Same problem
Toast.makeText(context, "WORK", Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
materialTypesDialog.show();
我的适配器,我使用了类似的微调器适配器,它工作得很好
class MaterialsAdapter extends ArrayAdapter<ItemData> {
private int groupId;
Activity context;
ArrayList<ItemData> list;
private LayoutInflater inflater;
/**
* @param context
* @param _groupId
* @param _id
* @param list
*/
MaterialsAdapter(Activity context, int _groupId, int _id, ArrayList<ItemData>
list) {
super(context, _id, list);
this.list = list;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.groupId = _groupId;
}
/**
* @param position
* @param convertView
* @param parent
* @return
*/
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = inflater.inflate(groupId, parent, false);
ImageView imageView = (ImageView) itemView.findViewById(R.id.image);
imageView.setImageResource(list.get(position).getImageId());
TextView textView = (TextView) itemView.findViewById(R.id.text);
textView.setText(list.get(position).getTextId());
return itemView;
}
/**
* @param position
* @param convertView
* @param parent
* @return
*/
public View getDropDownView(int position, View convertView, ViewGroup
parent) {
return getView(position, convertView, parent);
}
}
ItemData类
class ItemData {
private String id;
private int textId;
private int imageId;
/**
* @param id
* @param textId
* @param imageId
*/
private ItemData(String id, int textId, int imageId) {
this.id = id;
this.textId = textId;
this.imageId = imageId;
}
/**
* @return
*/
int getTextId() {
return textId;
}
/**
* @return
*/
int getImageId() {
return imageId;
}
/**
* @return
*/
String getId() {
return id;
}
/**
* @return
*/
static ArrayList<ItemData> createFromMaterialArray(Material[] materials) {
ArrayList<ItemData> itemDataList = new ArrayList<>();
for (Material material : materials) {
itemDataList.add(
new ItemData(material.getName(),
material.textID,
material.imageID);
}
return itemDataList;
}}
布局自定义\u材质\u项看起来像简单的线性布局,包含两个项ExtView和ImageView。尝试从alertdialog和setOnItemClickListener获取ListView,如下所示:
materialTypesDialog.getListView().setOnItemClickListener(
new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
}
});
并删除setOnItemSelectedListener。它无法使用AlertDialog。请尝试从AlertDialog和setOnItemClickListener中获取ListView,如下所示:
materialTypesDialog.getListView().setOnItemClickListener(
new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
}
});
并删除setOnItemSelectedListener。AlertDialog无法使用。问题出在我的自定义项目布局中。在我的父行中,添加了Clickable=true,这就是为什么没有触发OnClickListner 问题出在我的自定义项目布局中。在我的父行中,添加了Clickable=true,这就是为什么没有触发OnClickListner 这应该会有帮助。感谢您的回答,当我使用ArrayAdapter时,它可以工作,但当我使用自定义适配器OnClickListener时,它不工作。问题不在于错误,而在于我不明白如何调试它。我无法理解单击列表中的项目时触发的事件类型。删除materialTypesDialog.setOnItemSelectedListener事件并添加此AlertDialog alert=materialTypesDialog.create;警惕。显示;您可能创建的对话框不正确:这应该会有帮助。感谢您的回答,当我使用ArrayAdapter时,它可以工作,但当我使用自定义适配器OnClickListener时,它不工作。问题不在于错误,而在于我不明白如何调试它。我无法理解单击列表中的项目时触发的事件类型。删除materialTypesDialog.setOnItemSelectedListener事件并添加此AlertDialog alert=materialTypesDialog.create;警惕。显示;您可能创建的对话框不正确:谢谢您的回答,您的回答将我推向了正确的方向。问题出在我的布局上。很高兴能以某种方式帮助你。谢谢你的回答,你的回答把我推向了正确的方向。问题出在我的布局上。很高兴能帮助你。