Как установить флажки программно в ListView с DataSet?

Использование пользовательских ListView и сохранение, какие элементы выбраны в StringSet в SharedPreferences, При возврате в список в более позднее время цель после загрузки StringSet с предыдущими выборами, чтобы программно перепроверить сохраненные выборы. Я застрял с программной перепроверки с последнего использования.

private final myAdapter adapter = new myAdapter();
private List<User> working = new ArrayList<>();
private ListView listView;

listView = view.findViewById(R.id.multi_select);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                context.sendBroadcast(new Intent("nineteenVibrate"));
                CheckBox select = view.findViewById(R.id.select);
                working.get(i).isChecked = select.isChecked();
            }
        });

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

working.get (i).isChecked = select.isChecked ();

getView () класса MyAdapter

@Override
public View getView(final int i, View convertView, final ViewGroup parent) {
    Holder holder;
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.mass_photo_row, parent, false);
        holder = new Holder(convertView);
        convertView.setTag(holder);
    } else holder = (Holder) convertView.getTag();
    holder.name.setText(working.get(i).handle);
    return convertView;
}

Класс ViewHolder

private class Holder {
        final TextView name;

        Holder(View v) {
            name = v.findViewById(R.id.handle);
        }
    }

Класс пользователя

private class User {
        private String id, name;
        private boolean isChecked;

        User(String id, String name, boolean checked) {
            this.id = id;
            this.isChecked = checked;
            this.name = name;
        }
    }

В onCreate() я загружаю ArrayList из Stringset, содержащий проверенные идентификаторы от предыдущего использования

Set<String> set = settings.getStringSet("massIds", null);
        if (set != null) savedIds = new ArrayList<>(set);

Перед закрытием экрана, связанного со списком, я сохраняю, какие записи были проверены

Set<String> set = new HashSet<>();
                set.addAll(savedIds);
                settings.edit().putStringSet("massIds", set).apply();

Вот где у меня проблемы. Я возвращаю список пользователей, которые можно выбрать как JSONArray из JSONobjects. Достаточно просто. Затем каждый пользователь анализируется в объекте пользователя Java и добавляется в рабочий массив ListArray.

JSONArray users = new JSONArray(data);
for (int x = 0; x < users.length(); x++) {
    JSONObject user = users.getJSONObject(x);
    final String userId = String.valueOf(user.getInt("user_id"));
    working.add(new User(userId, user.getString("radio_hanlde"), savedIds.contains(userId)));
     }
//TODO: factor savings
adapter.notifyDataSetChanged();

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

new User(userId, user.getString("radio_hanlde"), savedIds.contains(userId))

savedIds.contains(идентификатор пользователя)

Итак, теперь рабочий массив знает, какие записи были проверены в последний раз, когда пользователь использовал интерфейс. Первоначальный план состоял в том, чтобы установить флажок установлен или не установлен в getview() адаптера на основе набора данных. Затем вручную обновите набор данных, чтобы он показывался отмеченным или нет, с помощью анонимного внутреннего класса OnCheckChangedListener(), затем обновите notifyDataSetChanged() - все внутри getView(). Это оказалось проблематичным, поскольку, когда представление прокручивалось за пределы экрана, прослушиватель onCheckChanged вызывался с флажком false, из-за перезапуска представления.

Что мне здесь не хватает? Как предварительно выбрать целевые представления флажков программно в виде списка на основе набора данных?

0 ответов

Другие вопросы по тегам