2013-08-08 4 views
5

У меня есть ListView заселен с пользовательским XML ListItems, это XML:Android ListView не Highlight, когда OnClickListener установлен

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="?android:attr/listPreferredItemHeight" 
       android:padding="6dip"> 
... 
</RelativeLayout> 

ListView правильно показывает на экране, и если я нажимаю или держать на элементе он становится синим (я использую Holo Light Theme)

проблема возникает, когда я пытаюсь присвоить OnClickListener к виду, внутри GetView в моей деятельности, которая простирается BaseAdapter:

@Override 
public View getView(int position, @Nullable View convertView, ViewGroup parent) { 
    ... 
    convertView = InflateUtils.inflate(mContext, R.layout.list_item); 
    ... 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "Test", 2000).show(); 
     } 
    }); 
... 
} 

после этого цвет выделения элемента списка больше не отображается, когда я нажимаю или удерживаю элемент списка, его фон остается белым, в любом случае onClickListener отлично работает.

Есть ли у вас предложение получить цвет подсветки при сохранении стилей по умолчанию для HoloLight?

ответ

3

Возможно, вы захотите использовать OnItemClickListener на самом ListView, вместо отдельных прослушивателей кликов для просмотра позиций.

Кроме того, проблема изюминкой уже описана здесь: Android listview no longer highlights selection onclick

+0

Лицо, которое отказалось, не прокомментируйте, что случилось с моим ответом? Таким образом, мы приблизимся к истине. –

+0

i did not, в любом случае мне было интересно узнать о OnItemClickListener, вы думаете, что это решит мою проблему? Есть ли проблемы с производительностью, отделяющие OnClickListener? - Я уже прочитал этот вопрос, но в решении не используется стиль HoloLight, который мне нужен. –

+0

Ну, если ваши предметы одинаковы, вы можете использовать один прослушиватель и различать по id элемента - один объект, а не, возможно, сотни. Что касается голо - вы можете использовать голо с решением из этого ответа, использование фона подсветки называется R.drawable.list_selector_holo_dark –

0

Добавить это расположение атрибутов для родительского RelativeLayout:

android:addStatesFromChildren="true" 

В качестве альтернативы, в коде вызова:

convertView.setAddStatesFromChildren(true); 

В любом случае убедитесь, что в дочерних макетах нет набора атрибутов android:duplicateParentState (и не вызывайте setDuplicateParentState(true)), o r вы получите исключение во время выполнения.

+0

Это не работая для меня, часть XML. программную часть я не могу проверить, потому что компилятор жалуется на метод setAddStatesFromChildren «Не существует». В любом случае, почему он должен работать? –

0

Вы можете сохранить поведение выделения и иметь несколько OnClickListener, если вы

  1. установить OnClickListener
  2. отключить OnClickListener
  3. Вызовите OnClickListener из OnItemClickListener.

Чтобы сделать это, добавьте setClickable(false) в код:

@Override 
public View getView(int position, @Nullable View convertView, ViewGroup parent) { 
    ... 
    convertView = InflateUtils.inflate(mContext, R.layout.list_item); 
    ... 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "Test", 2000).show(); 
     } 
    }); 
    // make non-clickable again, like before setting the OnClickListener 
    convertView.setClickable(false); 
    ... 
} 

и вызовите слушателя программно, например:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) 
{ 
    final View view = inflater.inflate(R.layout.fragment_with_listview, container, false); 
    final ListView your_listview = (ListView) view.findViewById(R.id.your_listview); 
    // delegate to specific callbacks 
    your_listview.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { view.callOnClick(); 
     } 
    }); 
    ... 
} 

Примечание документированное поведение callOnClick():

Непосредственно вызовите любой подключенный OnClickListener. В отличие от performClick(), это вызывает только прослушиватель и не выполняет никаких связанных действий щелчка, таких как сообщение о событии доступности.

Смежные вопросы