Я использую 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() никогда не вызывается.
Любые идеи о том, что может быть проблемой?
Спасибо.
Я использовал descendantFocusability="blockDescendants
в моем RelativeLayout
, и он работал.
Я думаю, это работает, потому что TextView не может получить фокус, поэтому строка List получает фокус и может реагировать на onItemClickListener.
Я получил это из комментариев в Как запустить onListItemClick в Listactivity с помощью кнопок в списке?
Если кто-нибудь сможет объяснить это лучше меня, я приму этот ответ.
Вместо установки OnClickListener
в свою строку используйте setOnItemClickListener(OnItemClickListener)
в ListView
.
getListView().setOnItemClickListener(new OnItemClickListener() {
в моем onCreate (), но все еще не работает ..
Я обнаружил, что вам нужно сделать:
android:focusable="false"
для каждого элемента, который вы хотите кликать в своем пользовательском представлении строк (например, я помещал это в imPlay, llFirstHalf, llSecondHalf и cbCheck). Создайте onClick-прослушиватели для областей, которые вы хотите кликать в этом представлении. Мой пример сделал 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;
}
}