2

Je commence à utiliser RecyclerView sur mes nouveaux projets d'école et RealmDB comme source de données. Jusqu'à présent, tout va bien jusqu'à ce que je rafraîchis la liste. voici demo. Il y a clignotement d'écran noir qui se passe à cause de notifyDataSetChanged(). Je peux définir un fond blanc au lieu de noir si je veux le rendre moins évident.Comment rafraîchir correctement ma liste de recycleur Afficher

Mais quel mécanisme dois-je utiliser pour éliminer totalement ce clignotement d'écran évident? Je serais très reconnaissant si j'obtiendrais le même résultat comme

Comment est-ce que j'actualise la vue de liste jusqu'ici?

  • ÉTAPE 1. J'ai appelé api web à des postes reçus
  • ÉTAPE 2. Obtenir le résultat et la mise à jour ou l'ajouter à #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. Realm informera les changements à l'adaptateur et le bloc de notification appellera notifyDataSetChanged() sur l'adaptateur recycleur.

Mon adaptateur (RecyclerView.Adapter)

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

MISE À JOUR J'avais changé notifyDataSetChanged()-notifyItemChanged(i, element). Le clignotement est parti et l'animation devient plus lisse :-)

+0

comment et où vous appelez onChange (---) Méthode d'écoute – Rahul

+0

Salut @Rah, RealmDB appellera cette méthode automatiquement s'il y a des changements à l'intérieur de cette table. – Sanny

+0

pouvez-vous s'il vous plaît ajouter un journal à l'intérieur onChange() méthode et vérifier combien de fois le journal se déclencher/imprimer, parce que vous avez autant d'enregistrements et cette méthode est appelée plusieurs fois – Rahul

Répondre

0

Les gars merci pour les commentaires et je l'obtiens résolu en éliminant l'utilisation de notifyDataSetChanged().

Changé de

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)); 
     } 
    }