2012-08-09 53 views
0

我有一个自定义对话框,它扩展了Dialog并在其布局中有一个ListView。我通过扩展ArrayAdapter的自定义适配器填充我的ListView。这里是我的适配器,它包含给定列表项的onClick事件:包含ListView的对话框其项目不会触摸事件

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(但不在对话框中),它的工作原理完美无瑕。我现在正在考虑这是一个错误。我错过了什么,或者我应该这样做(ListView与可点击的项目内的对话框)另一种方式?

编辑:

添加

rowView.setClickable(true); 
rowView.setFocusable(true); 

绝对没有。

EDIT2:

设置为我的ListView的onItemClickListener也不起作用,即使被滚出并返回到可见区的项目。

EDIT3:

我还注意到,当有16个项目(不是特殊号码)在ListView,最后5个项目没有得到我指定的高度(例如100像素)的布局我膨胀,他们的行为就像wrap_content。总而言之,我开始相信ListView不应该用在对话框中。

回答

0

我发现的一个可能的解决方案是退出尝试使用ListView,而是使用带有垂直LinearLayout的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。