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:

  1. 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?

  2. 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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top