2016-05-04 14 views
7

Ja uczę się królestwa i Recyclerview. Zrobiłem prostą aplikację, w której można łatwo dodawać elementy i usuwać je. Wszystko działa poprawnie, dopóki nie zacznę usuwać elementu jeden po drugim. Na ostatniej pozycji po kliknięciu usunąć to daje mi wyjątekjava.lang.IllegalStateException: Obiekt nie jest już zarządzany przez Realm. Czy został usunięty?

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

To jest mój kod

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

Oto całego stosu

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

Ty najwyraźniej próbuje odczytać 'firstName' po obiekt został usunięty. Jednym rozwiązaniem byłoby użycie 'obj.isValid()' w metodzie 'onBindViewHolder' i użycie" usuniętego "stanu, kiedy to się stanie. –

Odpowiedz

7

Ok dzięki Christian Melchior o pomoc. Poprawiłem mój kod, wykonując tę ​​

Przed

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

Po

@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()); 
     } 
    } 
Powiązane problemy