我正在使用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()。
关于问题可能是什么的任何想法?
谢谢。
答案 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;
}
}