2015-01-26 1 views
0

Я пытаюсь использовать selector, чтобы выделить выделенную строку в моем ListView. Мне нужно, чтобы он был выделен после того, как я выпустил прессу. Символирование выделенной строки - это выбранная строка.Селектор не работает для ListView внутри фрагмента

В настоящее время текст поменяет цвет по умолчанию. Мне нужно изменить цвет фона.

У меня есть ListView во фрагменте, который находится внутри DrawerLayout. Когда я выбираю устройство, DrawerLayout закрывается. Когда я снова открою DrawerLayout, фон выбранного устройства i не будет изменен. Текст выбранного устройства - это другой цвет, но не фон.

Я пробовал множество предложений здесь, на SO и ничего не нашел, что работает. Я нацелен на API-17, а minsdk - API-17.

Вот несколько сообщений, которые я пробовал без успеха.

Позвольте мне знать, если вам нужны какие-либо дополнительные подробности, спасибо.

Вот мой код (с последней вещи я пытался):

device_list_fragment.xml 
<?xml version="1.0" encoding="utf-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/device_list_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:choiceMode="singleChoice" 
    android:background="@drawable/device_selector" > 
</ListView> 

device_selector.xml 
<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_activated="true" 
     android:drawable="@drawable/device_selected"/> 
    <item 
     android:drawable="@drawable/device_not_selected"/> 
</selector> 

strings.xml 
<drawable name="device_selected">#777777</drawable> 
<drawable name="device_not_selected">#555555</drawable> 

DeviceListFragment 
public class DeviceListFragment extends Fragment implements OnItemClickListener { 
    public View onCreateView(...) { 
     View view = inflater.inflate(R.layout.device_list_fragment, container, false); 
       this.devicesArrayAdapter = new DevicesArrayAdapter(this.getActivity()); 

     this.deviceListView = (ListView) view.findViewById(R.id.device_list_view); 
     this.deviceListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     this.deviceListView.setAdapter(this.devicesArrayAdapter); 
     this.deviceListView.setOnItemClickListener(this); 

     return view; 
    } 

    public void onItemClick(...) { 
     this.deviceListView.setItemChecked(position, true); 
    } 
} 

DevicesArrayAdapter 
public class DevicesArrayAdapter extends ArrayAdapter<Device> { 
    public View getView(...) { 
     View rowView = layoutInflater.inflate(R.layout.device_element, parent, false); 
     return rowView; 
    } 
} 

ответ

1

Ваш адаптер является проблемой - вы только раздуваете представление и возвращаете его. Если вы хотите, чтобы фон вашего представления оставался другим цветом, вы должны установить флаг, который указывает, следует ли изменить строку rowView. Редкий массив - хороший способ сделать это. В противном случае каждый раз, когда вы показываете DeviceArrayAdapter, он получает представление по умолчанию, без изменения фона.

Что-то вроде этого:

getView(...) { 
    View rowView = layoutInflater.inflate(R.layout.device_element, parent, false); 

    If (arrayViews[position] == CHANGE_BACKGROUND){ 

     rowView.setBackground = NEW_COLOR; 
    } 

    return rowView; 
} 
+0

Я думал, что цель выбора заключается в оказании помощи в изменяющихся частях зрения на основе по какому типу отбора? Просто использование селектора не позволит сохранить изменения? – prolink007

+0

Хорошо. Я сделал это. Единственный способ, которым это работает для меня, - сделать вызов 'myArrayAdapter.notifyDataSetChanged();' в методе 'onItemClick()'. Это верно? – prolink007

+0

Я решил пойти с решением, которое у меня уже было, что было похоже на это решение.Это не совсем то, чего я ожидал, но сейчас это будет работать. Спасибо – prolink007

1

В вашем изменении DeviceFragment

public void onItemClick(...) { 
    this.deviceListView.setItemChecked(position, true); 
} 

Для

public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) { 
    view.setSelected(true); 
} 
+0

Я пробовал это уже, это не сработало. Вот сообщение, которое я пробовал, было связано с этим ответом. Http://stackoverflow.com/a/16190228/427763 – prolink007

+0

Попробуйте это тоже В вашем device_selector.xml изменить android: state_activated = "true" To android: state_selected = "true" – ayz4sci

+0

Я уже пробовал это, это не сработало. Если вы посмотрите на сообщение, которое я связал в своем предыдущем комментарии, вы увидите точные изменения, которые я сделал, чтобы попытаться заставить его работать. Он по-прежнему не смог сохранить подсветку. – prolink007