2017-10-12 13 views
-1

J'ai créé un RecyclerAdapter qui ressemble à ceci:Android - RecyclerView erreur adaptateur et filtre

public ActiveSubsRecyclerAdapter(Context context, List<Subscription> activeSubsList) { 
    this.mContext = context; 
    this.activeSubsList = activeSubsList; 

    this.activeFiltered = new ArrayList<>(); 
    this.activeFiltered = activeSubsList; 
} 

activeFiltered est une liste contenant des objets filtrés, qui contient initialement toute la liste.

J'ai une méthode filter() qui ressemble à ceci:

public void filter(final int category) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      //clear filteredActive 
      activeFiltered.clear(); 
      switch (category) { 
       case -1: 
        activeFiltered.addAll(activeSubsList); 
        break; 
       case 0: 
        for (Subscription sub : activeSubsList) { 
         if (sub.getCategory() == 0) activeFiltered.add(sub); 
        } 
        break; 
       case 1: 
        for (Subscription sub : activeSubsList) { 
         if (sub.getCategory() == 1) activeFiltered.add(sub); 
        } 
        break; 
       case 2: 
        for (Subscription sub : activeSubsList) { 
         if (sub.getCategory() == 2) activeFiltered.add(sub); 
        } 
        break; 
       case 3: 
        for (Subscription sub : activeSubsList) { 
         if (sub.getCategory() == 3) activeFiltered.add(sub); 
        } 
        break; 
       case 4: 
        for (Subscription sub : activeSubsList) { 
         if (sub.getCategory() == 4) activeFiltered.add(sub); 
        } 
        break; 
       case 5: 
        for (Subscription sub : activeSubsList) { 
         if (sub.getCategory() == 5) activeFiltered.add(sub); 
        } 
        break; 
       case 6: 
        for (Subscription sub : activeSubsList) { 
         if (sub.getCategory() == 6) activeFiltered.add(sub); 
        } 
        break; 
       case 7: 
        for (Subscription sub : activeSubsList) { 
         if (sub.getCategory() == 7) activeFiltered.add(sub); 
        } 
        break; 
       case 8: 
        for (Subscription sub : activeSubsList) { 
         if (sub.getCategory() == 8) activeFiltered.add(sub); 
        } 
        break; 
       case 9: 
        for (Subscription sub : activeSubsList) { 
         if (sub.getCategory() == 9) activeFiltered.add(sub); 
        } 
        break; 
      } 
      ((Activity) mContext).runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        notifyDataSetChanged(); 
       } 
      }); 
     } 
    }).start(); 
} 

L'adaptateur est initialisé dans l'activité principale comme ceci:

private List<Subscription> activeSubs = new ArrayList<>(); 

adapter = new ActiveSubsRecyclerAdapter(this, activeSubs); 
      recyclerView.setAdapter(adapter); 

et filtrer la liste dans la main_activity comme ceci:

@SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     switch (id) { 
      case R.id.nav_a: adapter.filter(-1); break; 
      case R.id.nav_b: adapter.filter(0); break; 
      case R.id.nav_c: adapter.filter(1); break; 
      case R.id.nav_d: adapter.filter(2); break; 
      case R.id.nav_e: adapter.filter(3); break; 
      case R.id.nav_f: adapter.filter(4); break; 
      case R.id.nav_g: adapter.filter(5); break; 
      case R.id.nav_h: adapter.filter(6); break; 
      case R.id.nav_i: adapter.filter(7); break; 
      case R.id.nav_j: adapter.filter(8); break; 
      case R.id.nav_k: adapter.filter(9); break; 
     } 
} 

Le problème est que quand je filte r, aucun élément n'est affiché.

J'ai essayé le débogage et obtenu que sur les deux:

adapter = new ActiveSubsRecyclerAdapter(this, activeSubs); 

et sur l'un des cas de filtre (par exemple):

case R.id.nav_a: adapter.filter(-1); break; 

le activeSubsList en adapter a une taille 3 (comme prévu).

Alors que quand je debug sur

case -1: activeFiltered.addAll(activeSubsList); break; 

dans la classe RecyclerAdapter, je reçois que activeSubsList a la taille 0. Et c'est la raison pour laquelle la liste n'est pas affichée.

Pouvez-vous m'aider à résoudre ce problème?

+0

Grande ... maintenant s'il vous plaît, dites-moi pourquoi il a été downvoted? Donc, je peux l'améliorer – Daniele

+1

utiliser [this] (https://gist.github.com/pskink/cd3bbdd742b5b1905a790c76831b5d85) adaptateur générique 'Filterable' comme une classe de base et remplacer sa méthode' matches() ' – pskink

+0

alors pourquoi ne pas vouloir utiliser des adaptateurs "génériques"? Voulez-vous écrire ce code de filtrage encore et encore lors de la création de nouveaux adaptateurs? – pskink

Répondre

1

Ok Je pense que le problème est avec cette ligne.

this.activeFiltered = activeSubsList; 

Vous êtes ici même emplacement de l'attribution mémoire pour les deux la liste, donc si vous ne activeFiltered.clear(); alors le activeSubsList être effacé,

Ainsi le constructeur ActiveSubsRecyclerAdapter. affecter la valeur par la méthode .addAll().

activeFiltered.addAll(activeSubsList); 

Donc finalement il regardera quelque chose comme

public ActiveSubsRecyclerAdapter(Context context, List<Subscription> activeSubsList) { 
    this.mContext = context; 
    this.activeSubsList = activeSubsList; 

    this.activeFiltered = new ArrayList<>(); 
    this.activeFiltered.addAll(activeSubsList); 
} 
+0

Ouais cela a corrigé, était aussi un peu évident ... Comment n'ai-je pas vu ça ... Merci pour l'aide – Daniele

+1

Heureux que ça a aidé :) Heureux codage .. – Sanoop

0
private List<Subscription> activeSubs = new ArrayList<>(); 

adapter = new ActiveSubsRecyclerAdapter(this, activeSubs); 
      recyclerView.setAdapter(adapter); 

je pense que problème est ici que vous avez initialiser la liste de sorte qu'il soit nul, mais vous avez l'habitude de rien dans la liste et vous passez que à l'adaptateur, si l'adaptateur n'a rien dans la liste et que vous essayez de filtrer sur la liste vide.peut-être que vous cause ce problème.

mise à jour

activeFiltered = new ArrayList<>(); 
public ActiveSubsRecyclerAdapter(Context context, List<Subscription> activeSubsList) { 
    this.mContext = context; 

    this.activeFiltered = activeSubsList; 
} 

j'ai mettre à jour ma réponse changer et essayer, laissez-moi savoir.

+0

Non, ce n'est pas tout le code. En fait j'appelle cette partie seulement quand la taille de la liste est> 0. Aussi j'obtiens la liste de sharedPreferences. La taille de la liste à ce point est toujours> 0 – Daniele

+0

l'avez-vous vérifié avec le débogage? –

+0

c'est exactement ce que j'ai fait. C'est écrit dans la question. – Daniele