Селектор не работает для ListView внутри фрагмента

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

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

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

Я пробовал многочисленные предложения здесь, на 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;
    }
}

person prolink007    schedule 26.01.2015    source источник


Ответы (2)


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

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

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

    If (arrayViews[position] == CHANGE_BACKGROUND){

         rowView.setBackground = NEW_COLOR;
    }

    return rowView;
}
person Martin    schedule 26.01.2015
comment
Я думал, что целью селектора было помочь изменить части представления в зависимости от того, какой тип выбора был сделан? Простое использование селектора не позволит сохранить изменение? - person prolink007; 26.01.2015
comment
В порядке. Я сделал это. Единственный способ, которым это работает для меня, - это вызвать myArrayAdapter.notifyDataSetChanged(); в методе onItemClick(). Это правильно? - person prolink007; 26.01.2015
comment
Я решил использовать решение, которое у меня уже было, похожее на это решение. Это не совсем то, что я ожидал, но пока это будет работать. Спасибо - person prolink007; 26.01.2015

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

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

To

public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
    view.setSelected(true);
}
person ayz4sci    schedule 26.01.2015
comment
Я пробовал это уже, это не сработало. Вот пост, который я пробовал, связанный с этим ответом stackoverflow.com/a/16190228/427763 - person prolink007; 26.01.2015
comment
Попробуйте это тоже. В вашем device_selector.xml измените android:state_activated=true на android:state_selected=true - person ayz4sci; 26.01.2015
comment
Я так уже пробовал, не получилось. Если вы посмотрите на сообщение, на которое я ссылался в своем предыдущем комментарии, вы увидите точные изменения, которые я внес, чтобы попытаться заставить его работать. Это все еще не удалось сохранить основной момент. - person prolink007; 26.01.2015