2016-05-04 7 views
7

Sto imparando Realm e Recyclerview. Ho creato app semplici in cui è possibile aggiungere elementi semplici ed eliminarli. Tutto sta funzionando bene fino a quando ho iniziato a cancellare gli articoli uno per uno. Al molto ultimo elemento quando clicco eliminarlo dammi eccezionejava.lang.IllegalStateException: l'oggetto non è più gestito da Realm. È stato cancellato?

java.lang.IllegalStateException: Object is no longer managed by Realm. Has it been deleted? 

Questo è il mio codice

@Override 
    public void onDeleteClick(int position) { 
     mRealm.beginTransaction(); 
     mResult.get(position).deleteFromRealm(); 
     mRealm.commitTransaction(); 
     adapter.notifyItemRemoved(position); 
    } 

Ecco stack completo

java.lang.IllegalStateException: Object is no longer managed by Realm. Has it been deleted? 
                      at io.realm.internal.InvalidRow.getStubException(InvalidRow.java:192) 
                      at io.realm.internal.InvalidRow.getString(InvalidRow.java:88) 
                      at io.realm.PersonsRealmProxy.realmGet$firstName(PersonsRealmProxy.java:67) 
                      at techiespk.realmpractice.Persons.getFirstName(Persons.java:22) 
                      at techiespk.realmpractice.MyListAdapter.onBindViewHolder(MyListAdapter.java:44) 
                      at techiespk.realmpractice.MyListAdapter.onBindViewHolder(MyListAdapter.java:15) 
                      at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5471) 
                      at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5504) 
                      at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4741) 
                      at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) 
                      at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) 
                      at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) 
                      at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) 
                      at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) 
                      at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) 
                      at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906) 
                      at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283) 
+2

Si sta apparentemente cercando di leggere 'firstName' dopo che l'oggetto è stato eliminato. Una soluzione sarebbe usare 'obj.isValid()' nel metodo 'onBindViewHolder' e usare uno stato" cancellato "quando ciò accade. –

risposta

7

Ok grazie a Christian Melchior di aiuto. Ho fissato il mio codice in questo modo

Prima

@Override 
    public void onBindViewHolder(MyListViewHolder holder, int position) { 
      Persons p = persons.get(position); 
      holder.firstName.setText(p.getFirstName()); 
      holder.lastName.setText(p.getLastName()); 
    } 

Dopo

@Override 
    public void onBindViewHolder(MyListViewHolder holder, int position) { 

     if (persons.get(position).isValid()) { 
      Persons p = persons.get(position); 
      holder.firstName.setText(p.getFirstName()); 
      holder.lastName.setText(p.getLastName()); 
     } 
    }