2013-08-01 3 views
1

У меня есть список, содержащий некоторые заголовки для разделения элементов списка. Идея состоит в том, чтобы заставить его вести себя аналогично приложению контактов в jellybean с заголовками разделов для инициалов букв. Подход, который я использую для этого, состоит в том, чтобы иметь дополнительный текстовый просмотр в моем list_item.xml, который я динамически скрываю или показываю на основе того, нужен ли новый разделитель для следующей буквы.Unclickable listview entry with two textviews

Проблема заключается в том, что всякий раз, когда заголовок раздела добавляется, он можно кликать вместе с самой следующей клиентской записью. Так что это было бы

A 
_____ 
Ally 

Это целая ячейка списка может быть выбрана пользователем. Я бы хотел, чтобы только союзник был выбран, а заголовок был не поддающимся выбору. Как я могу это сделать?

+0

Другой подход вы можете рассмотреть, чтобы использовать список представлений, каждый из которых содержит заголовок и список элементов (например, каждый вид внешним списком будет письмо, а затем список контактов). Однако я не уверен в технических подробностях о том, что внешний список игнорирует события щелчка, а внутренние списки прослушивают их. – Michelle

+0

Как вы добавляете заголовки? – codeMagic

+0

Они всегда определяются в моем list_item.xml, но они просто переключаются между видимыми и исчезают в зависимости от того, нужны ли они мне –

ответ

1

Решение 1, вам может использовать Amazing List View Library. Это работало для меня. вы можете ссылаться на его код, который не очень длинный.

Solution 2, добавить заголовок в обычном ListView следующим образом:

itemheader.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@drawable/daily_title" 
      android:textColor="#545454" 
      android:text="04/16" 
      android:paddingLeft="10dp" 
      android:gravity="center_vertical" 
      android:textSize="10sp" 
      android:id="@+id/header"/> 

item_rows.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       style="@style/ArticleList.item" 
       android:background="@drawable/list_item_bg" 
       android:orientation="vertical"> 
    <include 
      android:layout_width="fill_parent" 
      android:layout_height="24dp" 
      layout="@layout/itemheader" /> 

то вам просто необходимо позаботиться какая строка должна показывать заголовок.

+0

Если вам нужно решение, для которого не требуется внешняя библиотека, решение 2, вероятно, является лучшим. В той же логике, где вы хотели бы выбрать, показывать или нет заголовок, просто замените это, выбрав, нужно ли раздувать разные виды. –

0

Вот как я вижу проблему.

У вас уже есть установка, как это:

_ Ally

  • Клик на «А» (или область справа от него) не должно спровоцировать ListView в " onItemClick ".
  • Нажмите на «Ally» (или область справа от него), чтобы запустить событие ListView «onItemClick».

Существует простой исправить это:

Щелчок на «А» должен быть израсходован. Я полагаю, у вас есть настройки, подобные следующим внутри метода SomeAdapter.getView():

if (someCondition) { 
    headerTextView.setVisibility(View.VISIBLE); 
    headerTextView.setText("Hello"); 
} else { 
    headerTextView.setVisibility(View.GONE); 
} 

Поскольку headerTextView не иметь OnClickListener набор к нему, событию щелчка передается в ListView-х OnItemClickListener. Чтобы этого не произошло, добавьте OnClickListener в headerTextView, когда вы установите его видимость на VISIBLE.

if (someCondition) { 
    headerTextView.setVisibility(View.VISIBLE); 
    headerTextView.setText("Hello"); 

    headerTextView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Log.i("Header", "TextView Header was clicked"); 
     } 
    }); 
} else { 
    headerTextView.setVisibility(View.GONE); 
} 

Для вашей цели вы можете оставить onClick(View v) с пустым телом.

Предупреждение: Заголовок (приведенный в вашем примере) имеет один символ. Вам нужно будет предоставить TextView (удерживая заголовок) layout_width из match_parent. Таким образом, внешний вид не будет затронут, но видимая (пустая) область справа от текста будет заполнена headerTextView. Щелчок в этой области не вызовет ListView's onItemClick(). И щелчок на «Ally» или в другом месте вызовет его.