Domanda

Ho creato un elenco personalizzato estendendo SimpleCursoRadapter. Il risultato è Image + ControlTextView (Testo + Casella di controllo).

Dopo aver avuto problemi con le caselle di controllo sbagliate che vengono controllate (Vedere qui) Ho dovuto rimuovere lv.setchoiceMode (listView.choice_mode_mulple); da oncreate.

Ora faccio clic su una riga di ListItem e controlla la casella di controllo giusta.

Quello che sto cercando di fare è creare un LinearLayout.Visible quando 1 o più caselle di controllo vengono controllate e fare LinearLayout.gone Quando non viene controllata alcuna casella di controllo.

Ecco il codice:

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

} });

Questo è il modo in cui legato la Vervatta Elenco all'adattatore personalizzato:

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

Ho due problemi con questo:

  1. Se controllo 2 o più caselle di controllo e poi degluteggo solo una, il linearlayout scompare, il che significa SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions(); è zero. Perché è nullo se ci sono ancora altre caselle di controllo controllate?

  2. se cambio findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE); a findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE); (come voglio fare) la prima casella di controllo viene controllata correttamente e dopo che LinearLayout è sparito, tutto è di nuovo un disastro, proprio come su la mia domanda precedente.

Apprezzo qualsiasi aiuto!

È stato utile?

Soluzione

Perché ti aspetti che GetCheckEditemPositions () restituisca null se non ci sono articoli controllati? Sembra che la tua modalità scelta sia sbagliata

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.

L'array dovrebbe essere nullo solo se è scelta_mode_none.

Perché non provare qualcosa di simile?

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;
}

Aggiornare

Sono abbastanza sicuro che abbia a che fare con questa linea

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

Ottieni la vista, quindi riassegna la vista al buster. Sono un po 'in perdita, però esattamente perché darebbe il comportamento che stai facendo. Potresti anche voler provare il bindView() Metodo anche se non sono sicuro del perché. Forse invece di utilizzare il layout Android predefinito (quello che stai dando al setadapter, crea il tuo layout. Si sta chiaramente confuse su quale vista è assegnata a quale layout.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top