Android: list.getCheckedItemPositions () sempre retorna nulo
Eu criei um ListView personalizado estendendo o SimpleCursorAdapter. O resultado é IMAGE + CheckedTextView (Texto + Caixa de seleção).
Depois que tive problemas com as caixas de seleção erradas sendo marcadas (Veja aqui) Eu tive que removerlv.setChoiceMode (ListView.CHOICE_MODE_MULTIPLE); de onCreate.
Agora clico em uma linha ListItem e ela marca a caixa de seleção correta.
O que estou tentando fazer é criar um LinearLayout.VISIBLE quando uma ou mais caixas de verificação estiverem marcadas E tornar LinearLayout.GONE quando nenhuma caixa de seleção estiver marcada.
Aqui está o código:
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);
}});
É assim que vinculo o listView ao adaptador personalizado:
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));
Eu tenho dois problemas com isso:
se eu marcar 2 ou mais caixas de seleção e desmarcar apenas uma, o LinearLayout desaparecerá, o que significaSparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();
é nulo. por que é nulo se ainda existem outras caixas de seleção marcadas?
se eu mudarfindViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
parafindViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE);
(como eu quero fazer) a primeira caixa de seleção está sendo marcada corretamente e depois que o LinearLayout terminar, tudo ficará uma bagunça novamente, como emminha pergunta anterior.
Aprecio qualquer ajuda!