Андроид:list.getCheckedItemPositions() всегда возвращает ноль

StackOverflow https://stackoverflow.com/questions/4019308

  •  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));

У меня есть две проблемы с этим:

  1. если я проверю 2 или более флажка, а затем сниму флажок только с одного, LinearLayout исчезнет, ​​что означает SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions(); нулевой.почему оно равно нулю, если есть еще другие флажки?

  2. если я переключусь 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), создайте свой собственный макет.Очевидно, что возникает путаница относительно того, какое представление какому макету назначено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top