0

Есть:

ListView lv;
ArrayAdapter<String> adapter;
ArrayList<String> list4adapt = new ArrayList<>();
ArrayList<Boolean> al_checked = new ArrayList<>();

В onCreate:

lv = findViewById(R.id.lv_base);
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_multiple_choice, list4adapt);
    lv.setAdapter(adapter);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            cur_pos = position;
            log("1");
            SparseBooleanArray chosen = ((ListView) parent).getCheckedItemPositions();
            log(" " + String.valueOf(chosen.size()));
            al_checked.clear();
            for (int i = 0; i < chosen.size(); i++) al_checked.add(chosen.get(i));
        }
    });

log:1 проходит, а дальше рушится. Сообщение:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.util.SparseBooleanArray.get(int)' on a null object reference 
kaaa
  • 2,712
  • getCheckedItemPositions() возвращает null, если ListView задан режим CHOICE_MODE_NONE (устанавливается по умолчанию если не задано иное). – woesss Aug 09 '18 at 17:35

1 Answers1

0

Ваш SparseBooleanArray не возвращает ничего, он пуст. Попробуйте пределать так:

SparseBooleanArray chosen = lv.getCheckedItemPositions();
if (chosen != null) {
log(" " + String.valueOf(chosen.size()));
al_checked.clear();
for (int i = 0; i < chosen.size(); i++) al_checked.add(chosen.get(i));
}
McDaggen
  • 2,578
  • Да, но он не может быть пуст. ListView заполнен записями, это я наблюдаю на экране. В этом и проблема, почему он говорит что пустой. – kaaa Aug 09 '18 at 17:24
  • Если бы там был null, то оно б упало на chosen.size(), не? – Suvitruf - Andrei Apanasik Aug 09 '18 at 17:43
  • @kaaa, попробуйте сделать ребилд - потому что похоже на глюк - если там null - он реально должен был на chosen.size() выстрелить. – woesss Aug 09 '18 at 18:03
  • я сделал и clean, и rebuild и перезагрузил комп, но глюк остался. Падает на log(" " + String.valueOf(chosen.size())), но на экране в lv список загружен. Мистика блин. – kaaa Aug 09 '18 at 21:40
  • 1
    А, ну если на size(), тогда всё правильно - там null. Вы в тэге ListView атрибуту android:choiceMode задавали значение или в коде вызывали listView.setChoiceMode(...)? Если нет, то getCheckedItemPositions() всегда будет возвращать null. – woesss Aug 10 '18 at 06:40
  • Да, дело оказалось в вызове choiceMode, его не было! Благодарю. – kaaa Aug 10 '18 at 06:49