2013-08-20 3 views
0

У меня есть настройка ListView главной детали, и я хочу изменить фон для выбранных элементов в основном фрагменте.Настройка элемента ListView на выбранный

Я использовал следующий код, но это не позволяет мне использовать полноценный селектор:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = super.getView(position, convertView, parent); 

     // Highlight selected item 
     if (position == selectedPos) { 
      view.setBackgroundColor((view.getResources() 
      .getColor(R.color.nw_white))); 
     } else { 
      view.setBackgroundColor((view.getResources() 
      .getColor(R.color.nw_grey))); 
     } 
     return view; 
    } 

Это прекрасно работает, но я хочу использовать селекторы. (Потому что я хочу, чтобы элементы, чтобы изменить фон соответственно на фокус и нажмите.)

Так что я изменил его:

  @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = super.getView(position, convertView, parent); 

     // Highlight selected item 
     if (position == selectedPos) { 
      view.setSelected(true); 
      // view.setBackgroundColor((view.getResources() 
      // .getColor(R.color.nw_row_download_master_selected))); 
     } else { 
      view.setSelected(false); 
      // view.setBackgroundColor((view.getResources() 
      // .getColor(R.color.nw_row_download_master_normal))); 
     } 
     Log.d(TAG, "pos " + position + " is selected: " 
      + view.isSelected()); 

     return view; 
    } 

где список строк выглядеть следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/selector_row_collection_master" 
    android:orientation="horizontal" 
    > 

    ... 
</LinearLayout> 

И селектор следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/row_master_detail_pressed" 
      android:state_pressed="true" /> 
    <item android:drawable="@drawable/row_master_detail_focused" 
      android:state_focused="true" /> 
    <item android:drawable="@color/nw_row_master_master_selected" 
      android:state_selected="true" /> 
    <item android:drawable="@color/nw_row_master_normal" /> 
</selector> 

Строка реагирует на события кликов, но не на выбранные, хотя t он логгер говорит, что взгляд, действительно, выбран! Что происходит?

+0

избавиться от материала getView, просто установить селектор в Android-элемент ListView: backkground – pskink

+0

Затем выбранный элемент все еще не загорается ... – Maarten

+0

Я пробовал с простым TextView в качестве строки ListView, и он работал просто отлично – pskink

ответ

2

Я не знаю, почему вид не будет отображаться как выбранный, даже если он установлен в выборе, но этот код должен работать:

Использование ListView.setItemChecked():

mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
mListView.setItemChecked(position, isActivated); 

Selector:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/row_master_detail_pressed" 
      android:state_pressed="true" /> 
    <item android:drawable="@drawable/row_master_detail_focused" 
      android:state_focused="true" /> 
    <item android:drawable="@color/nw_row_master_master_selected" 
      android:state_activated="true" /> 
    <item android:drawable="@color/nw_row_master_normal" /> 
</selector> 

Поскольку android:state_activated доступна только после Honeycomb, добавьте в getView():

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
       // Highlight selected item 
       if (position == selectedPos) { 
        view.setBackgroundColor((view.getResources() 
          .getColor(R.color.nw_row_master_selected))); 
       } else { 
        Drawable sel = view.getResources().getDrawable(
          R.drawable.selector_row_collection_master); 
        view.setBackgroundDrawable(sel); 
       } 
      } 
1

Вам необходимо установить selector для вас item view и удалить selector вашего list-view. просто установите list-viewselector как @null. Надеюсь это поможет.

0

Вы должны использовать state_activated, не state_selected см https://stackoverflow.com/a/13634298/1283554

  • сделать список вашего Choosable, например установить android:choiceMode="singleChoice" на ListView

  • использовать селектор с 'state_activated="true" состояние, как элемента фона

  • выбрать элемент на ListView с myListView.setItemChecked(position, true)

Примечание: state_activated доступен только с Honeycomb. Для более старой версии я думаю, что вы не можете сделать это, используя только селектор. Вам, вероятно, нужно установить фон в getView

+0

Я пробовал stateActivated (true), и он также не обновляется. – Maarten

+0

И я хочу, чтобы мое приложение было совместимо с Gingerbread – Maarten

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