Как установить флажки программно в 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, из-за перезапуска представления.
Что мне здесь не хватает? Как предварительно выбрать целевые представления флажков программно в виде списка на основе набора данных?