Android: list.getCheckedItemPositions () retourne toujours null
-
26-09-2019 - |
Question
J'ai créé un ListView personnalisé en étendant SimpleCursorAdapter. Le résultat est IMAGE + CheckedTextView (texte + cases à cocher).
Après avoir eu des problèmes avec les mauvaises cases à cocher se cochées ( voir ici ) I dû enlever lv.setChoiceMode (ListView.CHOICE_MODE_MULTIPLE);. de onCreate
Maintenant, je clique sur une ligne ListItem et il vérifie la case à droite.
Ce que je suis en train de faire est de faire un LinearLayout.VISIBLE quand 1 ou plusieurs cases sont cochées ET CESSEZ LinearLayout.GONE lorsqu'aucun case est cochée.
Voici le code:
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);
} });
Voici comment je lie l'listView à l'adaptateur personnalisé:
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));
J'ai deux questions avec ceci:
-
si je vérifie 2 ou plusieurs des cases à cocher et décocher une seule, les LinearLayout disparaît ce qui signifie
SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();
est nulle. pourquoi est-il nul s'il y a encore d'autres cases à cocher vérifiés? -
si je passe
findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
àfindViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE);
(comme je veux faire) la première case est cochée correctement et après la LinearLayout est GONE, tout est un gâchis encore une fois, comme sur my question précédente .
apprécierais toute aide!
La solution
Pourquoi vous attendez getCheckedItemPositions () à null retour s'il ne sont pas cochés? Il ressemble à votre mode de choix est erroné
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.
Le tableau ne devrait être nulle si elle est choice_mode_none.
Pourquoi ne pas essayer quelque chose comme ça?
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;
}
Mise à jour
Je suis assez sûr qu'il a à faire avec cette ligne
View v = inView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.image_list, null);
}
Vous obtenez la vue, puis réattribuer la vue sur la gonfleur. Je suis un peu à une perte si exactement pourquoi il donnerait le comportement que vous êtes exeriencing. Vous pouvez également essayer la méthode bindView()
si je ne sais pas pourquoi. Peut-être au lieu d'utiliser la disposition par défaut Android (celui que vous donnez à la setAdapter, faites votre propre mise en page. Il est clairement se confondre à quelle vue est attribué à quelle disposition.