Андроид:list.getCheckedItemPositions() всегда возвращает ноль
-
26-09-2019 - |
Вопрос
Я создал собственный ListView, расширив SimpleCursorAdapter.Результатом является IMAGE + CheckedTextView (Текст + Флажок).
После того, как у меня возникли проблемы с установкой неправильных флажков (глянь сюда) пришлось удалить lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); из onCreate.
Теперь я нажимаю на строку ListItem, и она устанавливает правильный флажок.
Я пытаюсь сделать LinearLayout.VISIBLE, когда установлен 1 или несколько флажков, И сделать LinearLayout.GONE, когда ни один флажок не установлен.
Вот код:
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckedTextView markedItem = (CheckedTextView) view.findViewById(R.id.btitle);
if (!markedItem.isChecked()) {
markedItem.setChecked(true);
//show bottom control panel
findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.VISIBLE);
} else {
markedItem.setChecked(false);
SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();
//if no checkbox is checked, hide bottom control panel
if (lala == null) {
findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
}
}
view.refreshDrawableState();
//showSortBtn(markedItem);
} });
Вот как я привязываю listView к пользовательскому адаптеру:
projection = new String[] { Browser.BookmarkColumns._ID,
Browser.BookmarkColumns.FAVICON, Browser.BookmarkColumns.TITLE,
Browser.BookmarkColumns.URL };
displayFields = new String[] { Browser.BookmarkColumns.TITLE,
Browser.BookmarkColumns.FAVICON, Browser.BookmarkColumns.URL };
int[] displayViews = new int[] { android.R.id.icon, android.R.id.text1 };
cur = managedQuery(BOOKMARKS_URI, projection,
Browser.BookmarkColumns.BOOKMARK + " == 1", null, Browser.BookmarkColumns.VISITS + " DESC");
setListAdapter(new ImageCursorAdapter(this,
android.R.layout.simple_list_item_single_choice, cur,
displayFields, displayViews));
У меня есть две проблемы с этим:
если я проверю 2 или более флажка, а затем сниму флажок только с одного, LinearLayout исчезнет, что означает
SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();
нулевой.почему оно равно нулю, если есть еще другие флажки?если я переключусь
findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
кfindViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE);
(как я и хочу) первый флажок проверяется правильно, и после того, как LinearLayout исчезнет, все снова в беспорядке, как и в случае с мой предыдущий вопрос.
Ценю любую помощь!
Решение
Почему вы ожидаете, что getCheckedItemPositions() вернет значение null, если нет отмеченных элементов?Похоже, вы выбрали неправильный режим.
A SparseBooleanArray which will return true for each call to get(int position) where position is a position in the list, or null if the choice mode is set to CHOICE_MODE_NONE.
Массив должен иметь значение null только в том случае, если он имеет значение choice_mode_none.
Почему бы не попробовать что-то подобное?
if (((ListView) parent).getCheckedItemPositions().size() > 0){
findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.VISIBLE);
else{
findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE;
}
Обновлять
Я почти уверен, что это связано с этой строкой
View v = inView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.image_list, null);
}
Вы получаете представление, а затем переназначаете его на нагнетатель.Я как бы в недоумении, почему именно это привело к такому поведению, которое вы испытываете.Возможно, вы также захотите попробовать bindView()
метод, хотя я не уверен, почему.Возможно, вместо использования макета Android по умолчанию (того, который вы передаете setAdapter), создайте свой собственный макет.Очевидно, что возникает путаница относительно того, какое представление какому макету назначено.