2

我開始在我的新學校項目中使用RecyclerView,並以RealmDB作爲數據源。到目前爲止,它是相當好的,直到我刷新列表視圖。這裏是demo。由於notifyDataSetChanged()發生黑屏閃爍。如果我想使它不那麼明顯,我可以設置白色背景而不是黑色。如何正確刷新我的回收站列表視圖

但我應該使用什麼機制來徹底消除那個明顯的屏幕閃爍?我會非常感激,如果我會得到相同的結果,如here

如何刷新列表視圖到目前爲止?

  • STEP 1.我稱爲Web API收到帖子
  • STEP 2.獲取結果,更新或將其添加到#realm

    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.境界將通知修改到適配器,通知塊將在回收站適配器上調用notifyDataSetChanged()

在我的適配器(RecyclerView.Adapter

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

UPDATE 我改變了notifyDataSetChanged()notifyItemChanged(i, element)。閃爍消失,動畫變得更加流暢:-)

+0

如何以及在哪裏你打的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) { 
     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)); 
     } 
    }