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;
}
Où 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?
Grande ... maintenant s'il vous plaît, dites-moi pourquoi il a été downvoted? Donc, je peux l'améliorer – Daniele
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
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