Android: L'elemento errato è controllato quando si elenca la list

Sto soffrendo dalla stessa questione di questa domanda: un elemento errato è stato controllato quando filter ListView in android

Come suggerito nella domanda precedente, ho un Hashset che tiene tutte le opzioni selezionate, ma non riesco a capire come usarlo quando il cursore ripopola gli elementi selezionati.

  • Come utilizzare il caricatore dell'image universale per il caricamento di risorse localmente
  • Può il SDK Android funzionare con JDK 1.7?
  • Spostare un ImageView in una posizione diversa in modo animato in Android
  • Invia i comandi APDU alla carta USIM / SIM in android
  • Impedire più istanze della mia applicazione Android composta da un'unica attività
  • Android come rendere il text del button grassetto quando è premuto o focalizzato
  • Il mio problema è solo cosmetico – ad esempio:

    • "Facebook" si trova alla quinta posizione nell'elenco non filtrato.
    • L'utente ha cercato "faccia", solo "Facebook" appare nella prima posizione nell'elenco filtrato.
    • L'utente controlla "Facebook" come selezionato e torna all'elenco non filtrato.
    • L'elemento selezionato è il primo elemento dell'elenco e non "Facebook" (posizionato al 5 ° posto).

    Nota: tranne questo problema, tutto il resto funziona ottimamente. Ad esempio, "elimina" elimina le voci giuste perchè uso i selectedIds per farlo (anche se gli elementi selezionati sono errati).

    Fare clic con un solo clic su un elemento dell'elenco:

    OnItemClickListener mOnItemClickListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { //gets the Bookmark ID of selected position Cursor cursor = (Cursor)parent.getItemAtPosition(position); String bookmarkID = cursor.getString(0); boolean currentlyChecked = checkedStates.get(position); checkedStates.set(position, !currentlyChecked); if (!selectedIds.contains(bookmarkID)) { selectedIds.add(bookmarkID); selectedLines.add(position); } else { selectedIds.remove(bookmarkID); selectedLines.remove(position); } } }; 

    All'interno del Cursore: – qui è il problema.

    Questo ripropola gli elementi selezionati – il problema è che lo fanno per posizione (pos) e quale era la posizione giusta dell'elemento nell'elenco filtrato, non è la sua posizione nell'elenco non filtrato – con conseguente un elemento contrassegnato in modo errato.

     CheckedTextView markedItem = (CheckedTextView) row.findViewById(R.id.btitle); markedItem.setChecked(checkedStates.get(pos)); 

    Apprezzerò qualsiasi aiuto!

  • Extra di intenti vuoto in onActivityResult
  • Le situazioni in cui non viene richiamato il metodo onDestroy () di un servizio?
  • La crittografia della password di Android SQlite?
  • Miglior tempo / giorno per pubblicare su Android Market?
  • Avvio di una canzone da Spotify Intent
  • Android - SupportMapFragment con GoogleMaps API 2.0 che dà IllegalArgumentException
  • 3 Solutions collect form web for “Android: L'elemento errato è controllato quando si elenca la list”

    Potrebbe essere semplicemente che ListView non conosce il set di dati modificato? Chiamata notifyDatSetChanged () sull'adattatore per farlo sapere.

     my_adapter.notifyDataSetChanged(); 

    Ciò obbligherà a ridisegnare l'elenco con i dati aggiornati.

    Risolto il problema. Come suggerito nella domanda che ho aggiunto al mio, quando si popolano le caselle di controllo, l'altra list / hashset dovrebbe determinare se marcare l'elemento come controllato o no.

    Utilizzo del mio codice:

     //first you will need to get the current item ID String bookmarkID = cursor.getString(0); //Then, check if the current ID is in the selectedIds hash/list //If true - mark current item view as checked, else - uncheck. CheckedTextView markedItem = (CheckedTextView) row.findViewById(R.id.btitle); if (selectedIds.contains(new String(bookmarkID))) { markedItem.setChecked(true); } else { markedItem.setChecked(false); } 

    Davvero spero che questo aiuterà chiunque! 🙂

    Questa è la mia soluzione:

    • Per select un elemento nella visualizzazione di elenco dopo il filtraggio, all'inizio ho trovato un elemento errato perché ho usato questo:

       ItemData item = listItems.get(position); 

    Il modo corretto dovrebbe essere così:

      ItemData item = (ItemData) parent.getItemAtPosition(position); 
    • Per eliminare un elemento dopo aver filtrato, ho provato questo:

       for(int i=0;i<listItems.size();i++){ if(listItems.get(i).getItemID() == item.getItemID()){ listItems.remove(i); myAdapter.notifyDataSetChanged(); } } 

    Ma questo non funzionava perché il mio adattatore personalizzato. Nella mia scheda personalizzata, per utilizzare il filter, ho due listItems:

      ArrayList<ItemData> listItemsToShow = new ArrayList< ItemData >(); ArrayList< ItemData > listItemsBackup = new ArrayList< ItemData >(); 

    Per eliminare un elemento, ho aggiunto un nuovo metodo nella mia scheda personalizzata:

      public void deleteItem(String itemID) { for (int i = 0; i < listItemsToShow.size(); i++) { if (listItemsToShow.get(i).getId().equals(itemID)) { listItemsToShow.remove(i); break; } } for (int i = 0; i < listItemsBackup.size(); i++) { if (listItemsBackup.get(i).getId().equals(itemID)) { listItemsBackup.remove(i); break; } } 

    Infine per eliminare un elemento nella visualizzazione di elenco:

      subjectBaseAdapter.deleteItem(subject.getId()); subjectBaseAdapter.notifyDataSetChanged(); 

    Speriamo questo aiuto

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.