我有一个自定义对话框,它扩展了Dialog并在其布局中有一个ListView。我通过扩展ArrayAdapter的自定义适配器填充我的ListView。这是我的适配器,它包含给定列表项的onClick事件:
public class PendingTimeslotArrayAdapter extends ArrayAdapter<PendingTimeslot> {
private final Context context;
private final PendingTimeslot[] values;
private final View[] views;
public PendingTimeslotArrayAdapter(Context context, PendingTimeslot[] values) {
super(context, R.layout.mystuff_timeslot_picker_dialog_list_item, values);
this.context = context;
this.values = values;
this.views = new View[values.length];
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(views[position] == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.mystuff_timeslot_picker_dialog_list_item, parent, false);
rowView.setTag((Integer)position);
((TextView)rowView.findViewById(R.id.mystuff_timeslot_picker_list_item_date_time)).setText(values[position].getDateTime());
((TextView)rowView.findViewById(R.id.mystuff_timeslot_picker_list_item_stage_name)).setText(values[position].getStageName());
rowView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("getting touch event");
PendingTimeslot t = values[(Integer)(v.getTag())];
CheckBox checkBox = (CheckBox) v.findViewById(R.id.mystuff_timeslot_picker_list_item_checkbox);
checkBox.setChecked(!checkBox.isChecked());
t.toggle();
}
});
views[position] = rowView;
return rowView;
}
else
return views[position];
}
}
我的问题是,当点击列表项时,它们不会获得触摸事件,因此我的onClick不会被调用。有趣的是,ListView是完全可滚动的,当一个项目离开可见区域并返回时,它变得可触摸并且onClick事件被触发。
我尝试重写ListView及其onTouchEvent方法;单击一个项目时,ListView上的onTouchEvent实际上没有被触发。我也尝试重写dispatchTouchEvent方法,它可以正常工作,获取所有触摸事件。
我在其他地方使用了类似的自定义ArrayAdapter(但不在Dialog中),它运行完美。我现在认为这是一个错误。我是否遗漏了某些东西或者我应该这样做(ListView与Dialog中的可点击项目)另一种方式?
修改
添加
rowView.setClickable(true);
rowView.setFocusable(true);
绝对没有。
EDIT2:
为我的ListView设置onItemClickListener也不起作用,即使对于滚出和回到可见区域的项目也是如此。
EDIT3:
我还注意到,当ListView中有16个项目(不是特殊数字)时,最后5个项目在我膨胀的布局中没有得到我指定的高度(例如100px),它们的行为类似于wrap_content。总而言之,我开始相信不应该在Dialog中使用ListView。
答案 0 :(得分:0)
我找到的一个可能的解决方案是退出尝试使用ListView,而是使用内部具有垂直LinearLayout的ScrollView。这个ScrollView的布局是这样的:
<ScrollView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" >
<LinearLayout
android:id="@+id/mystuff_timeslot_picker_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
获取列表数据后,我为每个列表数据充气并将其手动添加到LinearLayout:
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
for(PendingTimeslot p : timeslots){
View rowView = inflater.inflate(R.layout.mystuff_timeslot_picker_dialog_list_item, timeslotList, false);
//((TextView)rowView.findViewById(R.id.mystuff_timeslot_picker_list_item_date_time)).setText(values[position].getDateTime());
((TextView)rowView.findViewById(R.id.mystuff_timeslot_picker_list_item_date_time)).setText("just testing");
//((TextView)rowView.findViewById(R.id.mystuff_timeslot_picker_list_item_stage_name)).setText(values[position].getStageName());
rowView.setClickable(true);
rowView.setFocusable(true);
rowView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("just testing");
//PendingTimeslot t = values[(Integer)(v.getTag())];
CheckBox checkBox = (CheckBox) v.findViewById(R.id.mystuff_timeslot_picker_list_item_checkbox);
checkBox.setChecked(!checkBox.isChecked());
}
});
timeslotList.addView(rowView);
}
timeslotList是我提到的LinearLayout。此解决方法按预期工作。尽管如此,当他们完美地完成这项工作时,我感到非常愚蠢,不得不使用ScrollViews而不是ListViews。