2016-08-11 2 views
1

Realm의 항목을 표시하는 RecyclerView이 있습니다. 은 내가 OrderedRealmCollection이 전달 도착되는 realm-android-adapters에 따라 RealmRecyclerViewAdapter을 구현 이렇게하려면.이를 위해 을 내가 findAllAsync()안드로이드에서 UI를 차단하지 않고 onClick 후에 RealmModel을 올바르게 업데이트합니다.

realm.where(Entry.class).findAllAsync() 

로 데이터를로드 그는 "좋아하는 옵션에이 목록을 통해 사용자가 스크롤이있는 경우 "항목 중 일부는"즐겨 찾기 "버튼에 보통 OnClickListener으로 구현했습니다.

사용자가 버튼을 클릭 할 때마다 항목의 "즐겨 찾기"부울을 업데이트하고 싶습니다. 사용자가 클릭하면 버튼에 작은 애니메이션이 표시됩니다. 이를 위해

나는 슬프게도 잘못된 스레드 예외를 제공하는 다음과 같은 시도 : 나는 작동 정상 executeTransaction와 그것을 시도 대안으로

realm.executeTransactionAsync(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
     entry.setLiked(!entry.isLiked()); 
    } 
}); 

을하지만, 표시되는 애니메이션을 방지 할 수 있습니다. 이것은 다음과 같은 로그를 제공 흥미로운 추가로

realm.executeTransaction(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
     entry.setLiked(!entry.isLiked()); 
    } 
}); 

:

지역 쓰기와 비동기 쿼리를 혼합은 피해야한다. Realm은 일관성을 유지하기 위해 비동기식 쿼리를 동기식으로 변환합니다. 대신 비동기 쓰기를 사용하십시오.

지연을 도입하거나 애니메이션이 표시되지 않도록 항목을 완전히 비동기로 업데이트 할 수 있습니까?

답변

2

RealmRecyclerViewAdapter 전화 adapter.notifyDataSetChanged() 당신의 영역이 자동 업데이트되는, 그래서 레이아웃 애니메이션이 호출되지 않습니다.

실제로 변화를 수행하기위한로서

,

public class EntryViewHolder extends RecyclerView.ViewHolder { 
    @BindView(R.id.entry_favorite) 
    Button favButton; 

    public EntryViewHolder(View view) { 
     super(view); 
     ButterKnife.bind(this, view); 
    } 

    public void bind(Entry entry) { 
     final long entryId = entry.getId(); 
     favButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       realm.executeTransactionAsync(new Realm.Transaction() { 
        @Override 
        public void execute(Realm realm) { 
         Entry entry = realm.where(Entry.class) 
              .equalTo("id", id) 
              .findFirst(); 
         if(entry != null) { 
          entry.deleteFromRealm(); 
         } 
        } 
       }); 
      } 
     }); 
    } 
} 
+0

당신은 단순히'adapter.notifyDataSetChanged()'방지 응용 프로그램에 관련이 맞다. 이것은 내가 업데이트 할 때마다 트리거 될 것이라고 완전히 간과했다. 감사 – mikepenz

0

백그라운드 스레드에서 실행하십시오. 클래식 Thread.class를 사용하는 것이 좋습니다. 새 스레드를 outisde 애니메이션을 시작하고 UI 스레드 콜백을 통해 해제하십시오.

Realm realm = Realm.getInstance(..); 
realm.beginTransaction(); 
YourClass yourClassInstance = realm.where(YourClass.class) 
     .equalTo(..) 
     .findFirst(); 
if(yourClassInstance != null){ 
    yourClassInstance.setLiked(!yourClassInstance.getLiked()); 
}else{ 
    yourClassInstance = realm.createObject(YourClass.class); 
    yourClassInstance.setLiked(whateverYouWant); 
} 
realm.commitTransaction();