包含ListView的对话框,其项目不会触及事件

时间:2012-08-09 11:36:54

标签: android listview dialog

我有一个自定义对话框,它扩展了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。

1 个答案:

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