Сделать часть ListView`s Header- / FooterView выбираемой - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть ListView с пользовательским нижним колонтитулом, установленным через

list.addFooterView(getLayoutInflater().inflate(R.layout.list_footer_view, null, true), null,true);

list_footer_view.xml выглядит так:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:descendantFocusability="afterDescendants" android:focusable="false">
<LinearLayout android:onClick="onProfileClick"
    android:focusable="true" android:clickable="true">
    <TextView android:text="@string/footer_text"
        style="@style/Text" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:layout_weight="1" />
</LinearLayout>
... other views which should not be focusable

 </LinearLayout>

Проблема в том, что в режиме без касания выбирается только весь нижний колонтитул. Как вы видите, я уже пытался манипулировать поведением выбора с помощью атрибутов descendantFocusability и focusable. Безуспешно. В сенсорном режиме нажатие первого LinearLayout работает.

Я также пытался установить для третьего параметра addFooterView значение false.

Как выбрать только дочерние элементы нижнего колонтитула?

1 Ответ

3 голосов
/ 22 февраля 2012

Вы также должны вызвать setItemsCanFocus (true) в ListView.Таким образом, на самом деле нужно сделать две вещи:

  1. android: DesndantFocusability = "afterDescendants" для верхнего и нижнего колонтитула ViewGroups
  2. setItemsCanFocus (true) для всего ListView (вы можете захотетьдля установки android: focusable = "false" и android: focusableInTouchMode = "false" для строки ViewGroup

Вам также может потребоваться установить focusable = "true" для ваших элементов, которые необходимо сфокусировать.Вот пример:

poi_details_buttons.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:descendantFocusability="afterDescendants"
  android:orientation="vertical" >

  <View style="@style/Poi.DetailsSeparator" />

  <Button
    android:id="@+id/show_all_comments"
    style="@style/Poi.DetailsItem"
    android:drawableRight="@drawable/icon_forward"
    android:hint="@string/poi_details_show_all_comments"
    android:text="@string/poi_details_show_all_comments" />

  <View style="@style/Poi.DetailsSeparator" />

  <Button
    android:id="@+id/report_bug"
    style="@style/Poi.DetailsItem"
    android:drawableRight="@drawable/icon_forward"
    android:hint="@string/poi_details_report_bug"
    android:text="@string/poi_details_report_bug" />

  <View style="@style/Poi.DetailsSeparator" />

</LinearLayout>

PoiFragment.java:

      protected View createView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
    list = (ListView) (ViewGroup) inflater.inflate(R.layout.poi_details, container, false);

    // allow buttons in header/footer to receive focus (comment_row.xml has focusable=false
    // for it's element, so this will only affect header and footer)
    // note: this is not enough, you should also set android:descendantFocusability="afterDescendants"
    list.setItemsCanFocus(true);

...

    View buttonsView = inflater.inflate(R.layout.poi_details_buttons, null);
    buttonsView.findViewById(R.id.show_all_comments).setOnClickListener(this);
    buttonsView.findViewById(R.id.report_bug).setOnClickListener(this);

    list.addFooterView(buttonsView, null, false);

    return list;
  }
...