Android: list.getCheckEckEditemPositions () restituisce sempre null
-
26-09-2019 - |
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:
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?se cambio
findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
afindViewById(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!
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.