Сделайте строку ListView кликабельной, используя пользовательский CursorAdapter - PullRequest
1 голос
/ 25 января 2011

Я использую 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 ]

4 голосов
/ 25 января 2011

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

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

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

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

1 голос
/ 25 января 2011

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

0 голосов
/ 25 августа 2013

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

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...