2010-10-25 3 views
0

Я создал собственный ListView, расширив SimpleCursorAdapter. Результатом является IMAGE + CheckedTextView (Text + Checkbox).Android: list.getCheckedItemPositions() всегда возвращает null

После того, как у меня возникли ошибки с проверкой флажков (see here) Мне пришлось удалить 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(); имеет значение NULL. почему он равен нулю, если есть еще другие флажки?

  2. если я переключаюсь findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE); к findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE); (как я хочу сделать) первый флажок, проверяется правильность и после того, как LinearLayout нет, все беспорядок снова, так же, как на my previous question.

Цените любую помощь!

ответ

2

Почему вы ожидаете 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.

Массив должен быть только ноль, если это 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; 
} 

Update

Я уверен, что это имеет отношение к этой линии

View v = inView; 
     if (v == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.image_list, null); 
     } 

Вы получаете вид, затем переназначить вид на Inflater. Я немного растерялся, хотя точно, почему это привело бы к поведению, которое вы испытываете. Вы также можете попробовать метод bindView(), хотя я не уверен, почему. Возможно, вместо того, чтобы использовать макет по умолчанию для Android (тот, который вы передаете в setAdapter, создайте свой собственный макет. Очевидно, он путается в отношении того, какой вид присваивается какому макету.

+0

Как я уже говорил, мой choice_mode не set (что означает, что он установлен в none), потому что когда я использую lv.setChoiceMode (ListView.CHOICE_MODE_MULTIPLE); Я получаю то, что происходит по моему предыдущему вопросу: http://stackoverflow.com/questions/4010623/android-click-on-listitem-checks-wrong-checkbox - при установке флажка на определенной строке он устанавливает флажок на другая линия ... Любое решение для этого? Думаю, это решит все мои проблемы: \ –

+0

Я обновил свой ответ, попробую что-то подобное. В вашем первом, хотя. Вы должны установить режим multi_choice – Falmarri

+0

нет ... такие же проблемы. если я не устанавливаю режим выбора, я замечаю (или принудительно закрываю для Null), и если я устанавливаю lv.setChoiceMode (ListView.CHOICE_MODE_MULTIPLE); Я получаю сумасшедший checkboxing ...: \ –

Смежные вопросы