Android MultiSelectListPreference с приоритетом

Я новичок в Android. Я хочу использовать MultiSelectListPreference для моего случая.

Но я сталкиваюсь с проблемой: мой список должен сохранять порядок элементов. Предположим, что есть 5 элементов:

0 - Tom
1 - David
2 - Bob
3 - Mary
4 - Chris

и пользователь выбирает 0, 2, 3. Тогда список должен быть в следующем порядке:

Том, Боб, Мэри

Но MultiSelectListPreference хранит настройки в Set<String>не ArrayList<String>поэтому он не уверен для этого заказа из-за Set,

Как я могу убедиться в этом заказе? Спасибо.

1 ответ

Решение

camdaochemgio, я понял твой вопрос еще до твоего редактирования.

Поскольку речь идет о множестве (в котором хранятся уникальные значения), эту функцию getValues ​​() необходимо ввести в вашу собственную функцию revertValues, которая переводит значения в индексы - на основе ваших предустановок данных. Я попросил ваш код, чтобы я мог выразить себя, написав решение для этого в своем собственном стиле / терминологии.

Решение:

Я заметил в документах MultiSelectListPreference следующий метод:

int findIndexOfValue(String value)

Но вы не сохраняете такую ​​ссылку на объект, поэтому я создал этот класс для расширения MultiSelectListPreference (в новом файле!):

public class DataHolder extends MultiSelectListPreference {

    // note: AttributeSet  is needed in super class
    public DataHolder(Context context,AttributeSet attrs) {   
        super(context, attrs);

        List<CharSequence> entries = new ArrayList<CharSequence>();
        List<CharSequence> entriesValues = new ArrayList<CharSequence>();

        /** We could use the String Array like you did in your Q, 
         * But I preffer this way of populating data - 
         * It keeps things open and unlimitted.
         * If you really want the data picked up from the xml , just use : 
         * context.getResources().getStringArray(R.array.entries)  and
         * context.getResources().getStringArray(R.array.entryValues) 
         * */

        entries.add("0");
        entries.add("1");
        entries.add("2");
        entries.add("3");
        entries.add("4");
        entriesValues.add("Tom");
        entriesValues.add("David");
        entriesValues.add("Bob");
        entriesValues.add("Mary");
        entriesValues.add("Chris");

        setEntries(entries.toArray(new CharSequence[5]));
        setEntryValues(entriesValues.toArray(new CharSequence[5]));
    }
}

Теперь нам нужно подключить его к вашему слушателю. В своем классе SettingsFragment просто добавьте новое поле:

private DataHolder dh = null;

И измените конструктор, чтобы принять его и инициализировать:

public SettingsFragment(Context c) {
    dh = new DataHolder(c,null);
}

Следующий шаг: удалить ссылку на данные из xml. Теперь это должно выглядеть так:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <com.example.multiselectpref.DataHolder
        android:key="pref_key_name_choice"
        android:title="@string/name_choice"
    />
</PreferenceScreen>

Возвращаясь к слушателю, в методе onSharedPreferenceChanged вы можете изменить тост:

toast_message += (dh.findIndexOfValue(name) + ": "+name+"    , ");

Работает для меня.. (код, переданный в fork @ https://github.com/li3ro/MultiSelectPref)