Сделайте строку ListView кликабельной, используя пользовательский CursorAdapter

1

Я использую 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() никогда не вызывается.

Любые идеи о том, что может быть проблемой?

Спасибо.

Теги:
layout
listview

3 ответа

4
Лучший ответ

Я использовал descendantFocusability="blockDescendants в моем RelativeLayout, и он работал.

Я думаю, это работает, потому что TextView не может получить фокус, поэтому строка List получает фокус и может реагировать на onItemClickListener.

Я получил это из комментариев в Как запустить onListItemClick в Listactivity с помощью кнопок в списке?

Если кто-нибудь сможет объяснить это лучше меня, я приму этот ответ.

  • 0
    Хорошая работа, спасибо!
1

Вместо установки OnClickListener в свою строку используйте setOnItemClickListener(OnItemClickListener) в ListView.

  • 0
    Я использовал getListView().setOnItemClickListener(new OnItemClickListener() { в моем onCreate (), но все еще не работает ..
0

Я обнаружил, что вам нужно сделать:

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;
    }

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню