使用自定义CursorAdapter使ListView行可单击

时间:2011-01-24 23:18:47

标签: android listview layout

我正在使用Custom CursorAdapter覆盖newView()和bindView()来显示自定义ListView。

我正在膨胀行布局xml文件并将OnClickListener绑定到作为参数传递给bindView()的视图:

public void bindView(View view, Context context, Cursor cursor) {
view.setOnClickListener(new OnClickListener() { }
...
}

我也在行xml中使用相对布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
      android:paddingTop="10px"
    android:paddingBottom="10px"
    android:paddingLeft="10px"
    android:paddingRight="10px"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
  >

    <TextView android:id="@+id/episode_title_text" xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="wrap_content"
      android:layout_height="fill_parent"
    android:textSize="20px"
    android:layout_weight="1" 
    />

</RelativeLayout>

我的问题是当我单击列表中的项目时,没有任何反应,永远不会调用OnClickListener.onClick()。

关于问题可能是什么的任何想法?

谢谢。

3 个答案:

答案 0 :(得分:4)

我在descendantFocusability="blockDescendants中使用了RelativeLayout,但它确实有效。

我认为这是有效的,因为TextView无法获得焦点,因此List行获得焦点并且可以响应onItemClickListener。

我从How to fire onListItemClick in Listactivity with buttons in list?

的评论中得到了这个

如果有人能比我更好地解释这一点,我会接受这个答案。

答案 1 :(得分:1)

不要在行中设置OnClickListener,而是在ListView中使用setOnItemClickListener(OnItemClickListener)

答案 2 :(得分:0)

我发现你需要这样做:

android:focusable="false"

对于您希望在自定义行视图中可单击的每个项目(例如,我将其放在imPlay,llFirstHalf,llSecondHalf和cbCheck中)。为您希望在该视图中单击的区域创建onClick侦听器。我的示例在listview行视图中创建了4个可单击区域。

@Override
public void bindView(View v, Context context, Cursor c) {

    ImageView imPlay = (ImageView) v.findViewById(R.id.row_play_button);
    LinearLayout llFirstHalf = (LinearLayout) v.findViewById(R.id.row_first_half);
    LinearLayout llSecondHalf = (LinearLayout) v.findViewById(R.id.row_second_half);
    CheckBox cbCheck = (CheckBox) v.findViewById(R.id.row_checkbox);

    imPlay.setOnClickListener(this);
    llFirstHalf.setOnClickListener(this);
    llSecondHalf.setOnClickListener(this);
    cbCheck.setOnClickListener(this);



}

@Override
public void onClick(View v) {
    switch(v.getId()){

    case R.id.row_checkbox:
        Log.e("ListAdapter onClick","checkbox");
        break;
    case R.id.row_first_half:
        Log.e("ListAdapter onClick","row first half");
        break;
    case R.id.row_second_half:
        Log.e("ListAdapter onClick","row second half");
        break;
    case R.id.row_play_button:
        Log.e("ListAdapter onClick","play button");
        break;
    }

}