2

새 학교 프로젝트에서는 RecyclerView을 사용하고 데이터 소스로는 RealmDB을 사용하기 시작합니다. 지금까지 목록보기를 새로 고칠 때까지는 꽤 괜찮습니다. 여기에 demo입니다. notifyDataSetChanged() 때문에 검은 화면이 깜박입니다. 내가 덜 명백하게하고 싶다면 검정 대신 흰색 배경을 설정할 수 있습니다.리사이클러 목록을 올바르게 새로 고치는 법

하지만 분명히 깜박이는 화면을 완전히 없애려면 어떤 메커니즘을 사용해야합니까? 같은 결과를 얻을 수 있다면 매우 감사하겠습니다. here

지금까지 목록보기를 새로 고치는 방법은 무엇입니까?

  • STEP 1. 나는 변경 사항을 통지합니다

    mRealm.executeTransactionAsync(new Realm.Transaction() { 
        @Override 
        public void execute(Realm realm) { 
        for (Post post : posts) { 
         //create post 
         realm.copyToRealmOrUpdate(post); 
         //create common result row 
         CommonResult cr = new CommonResult(); 
         int id = module.hashCode() + post.getId(); 
         cr.setId(id); 
         cr.setPost(post); 
         cr.setPostid(post.getId()); 
         cr.setTag(module.hashCode()); 
         realm.copyToRealmOrUpdate(cr); 
        } 
    } 
    }, new Realm.Transaction.OnSuccess() { 
        @Override 
        public void onSuccess() { 
        RealmResults<CommonResult> cr = mRealm.where(CommonResult.class) 
         .equalTo("tag", module.hashCode()) 
         .findAll(); 
        mPostView.showListingView(cr, hasNext()); 
    } 
    }); 
    
  • STEP 3. 영역을 #realm하는

  • STEP 2. 결과 및 업데이트를 구하거나 추가받은 게시물에 웹 API를 호출 어댑터와 알림 블록은 재활용 어댑터에 notifyDataSetChanged()을 호출합니다. 내 어댑터에서

(RecyclerView.Adapter)

this.data.addChangeListener(new RealmChangeListener<RealmResults<CommonResult>>() { 
    @Override 
    public void onChange(RealmResults<CommonResult> element) { 
     notifyDataSetChanged(); 
    } 
}); 

내가 notifyItemChanged(i, element)notifyDataSetChanged()을 변경했다 UPDATE. 깜빡임이 사라지고 애니메이션이 부드럽게됩니다 .-)

+0

어떻게 당신이 호출에

this.data.addChangeListener(new RealmChangeListener<RealmResults<CommonResult>>() { @Override public void onChange(RealmResults<CommonResult> element) { notifyDataSetChanged(); } }); 

에서 변경의 onChange (---) 변경이있는 경우 – Rahul

+0

안녕 @Rah이 RealmDB는 자동으로이 메소드를 호출 수신기의 방법 이 테이블 안에. – Sanny

+0

당신은 onChange() 메소드 내부에 어떤 로그를 추가하고 트리거/프린트를 얻는 횟수를 체크 할 수 있습니다. 많은 레코드가 있고이 메소드가 여러 번 호출되기 때문에 – Rahul

답변

0

여러분의 의견에 감사드립니다. notifyDataSetChanged()의 사용을 제거하여 해결했습니다.

this.data.addChangeListener(new RealmChangeListener<RealmResults<CommonResult>>() { 
      @Override 
      public void onChange(RealmResults<CommonResult> element) { 
       notifyItems(element); 
       Timber.i("onChange() called with: element = [" + element + "]"); 
      } 
     }); 


private void notifyItems(RealmResults<CommonResult> element){ 
     for (int i = 0; i < element.size(); i++) { 
      notifyItemChanged(i, element.get(i)); 
     } 
    } 
관련 문제