8
votes

Impossible d'écrire un algorithme pour filtrer les éléments dans un recyclerview basé sur une longue sauvegarde avec chaque article

J'ai plusieurs éléments dans un recyclerview code> et chaque élément comporte une valeur code> enregistrée avec elle. J'utilise FASTADAPTER comme adaptateur pour mon recyclerview code>.

. Supposons qu'il y ait 7 éléments dans le recyclerview code> avec les valeurs longues: 11122 code>, 12321 code>, -98811 code>, 8870 code>, -88009 code>, 3398 code> et -22113 code>. p>

donc, ce que je veux strong> est, je veux filtrer les éléments basés sur les valeurs longues ci-dessus à l'aide de cette logique: P>

if (l <= 1000) {
  // show items with long value <=1000
} else if (l > 1000) {
  // show items with long value >1000
}


5 commentaires

Avec la quantité de détails donnée, cela appelle à une reformulation des beaux manuels. Il pourrait s'avérer plus constructif de montrer ce que vous avez essayé et décrivez ce que vous avez observé et dans la mesure où cela est tombé suffisant.


D'accord, il suffit de regarder à travers votre édition. Maintenant, si je suis correct, il y a plusieurs cartes à l'intérieur RECYCLERVIEW , et que vous souhaitez afficher toutes les cartes, mais seules les informations affichées à l'intérieur de la carte doivent être filtrées en fonction de la valeur longue. Ai-je raison?


@Abhi non .. Je veux afficher uniquement ces cartes dans lesquelles la valeur longue stockée est soit <= 1000 ou > 1000 respectivement comme choisies par l'utilisateur.


Avez-vous à mettre en œuvre filtré ? Quelle est la meilleure solution et c'est aussi une solution dynamique.


@MOINKHAN J'ai essayé mais je suis incapable de créer une logique! Ça ne marche pas ..: /


5 Réponses :


6
votes

Avec la quantité d'informations fournies, je ne peux supposer que l code> est une valeur de sélecteur étranger qui contrôle les éléments à afficher à l'intérieur du recyclerview code>. Commentaire ci-dessous Si ce n'est pas le cas, je vais essayer de corriger ma réponse.

Je vous recommande de mettre en œuvre une liste de visionneuse code>, d'envoi dans la liste des éléments et de la variable de sélecteur l Code> Utiliser des méthodes respectives: P>

public class ItemsAdapter extends 
    RecyclerView.Adapter<ItemsAdapter.ItemViewHolder> {

    private List<Long> mItemList;
    private List<Long> mDisplayItems;
    private boolean mAboveThousand = true;

    public void setItemList(List<Long> list) {
        mItemList = list;
        updateDisplayItems();
    }

    public void setSelectionType(boolean aboveThousand) {
        mAboveThousand = aboveThousand;
        updateDisplayItems();
    }

    private updateDisplayItems() {
        mDisplayItems.clear();

        for(Long item: mItemList) {
            if(/*check your contition*/) {
                mDisplayItems.add(item);
            }
        }

        notifyDataSetChanged(); //important
    }

    ...
    // Rest of implementation
}


8 commentaires

l est le suivant: 11122 , 12321 , -98811 , 8870 , < Code> -88009 , 3398 et -22113 . Enregistré avec les éléments de recyclerview respectivement.


@HAMMADNASIR Je ne peux pas comprendre comment voulez-vous filtrer les "articles", aussi qu'entendez-vous exactement par des éléments? Pouvez-vous s'il vous plaît clarifier avec un exemple?


Merci d'avoir répondu, veuillez vérifier la question modifiée (la pièce écrite dans Mise à jour 1 ).


La réponse d'Abhi travaille ici aussi bien. Bien que le «reste de la mise en œuvre» implique les différents détenteurs de vues dynamiques basées sur le type. Ensuite, peu importe ce qui est dans la liste MDISPAplayItems parce que même si vous l'avez nourri de chaque élément, cela les mettrait simplement dans leur type de données respectif en conséquence.


Peut-être que cette réponse peut résoudre mon problème, mais le problème est que j'ai du mal à utiliser cette réponse car je ne peux pas comprendre comment et où utiliser cela! Aidez-moi s'il vous plaît à obtenir tout cela clair. : |


@Abhi Voici ce que j'ai essayé de faire à l'aide de FastAdapter: Gist.github.com/hammadnasir/0152E9513BE1059DDB24B12072B74BC Mais cela n'a pas fonctionné!


@Abhi s'il vous plaît ne laissez pas encore ça .. que dois-je faire? Devrais-je juste commencer tout en plus et arrêter l'utilisation de fixatedapter ici?


@HAMMADNASIR désolé pour le retard, ma machine est en réalité et est sortie pour la réparation, je ne peux pas vraiment vous aider avec FastAdapter sans l'essayer. Donc, je vous suggérerais de laisser tomber FastAdapter pour l'instant et de passer à la normale.



4
votes

Même votre code très basique, il y aurait fonctionner. Vous pouvez compter le nombre d'éléments dans cette plage et renvoyer le nombre dans cette plage. Je vous suggère d'essayer de le faire sans fixation rapide car le concept de base de l'analyse des données basé sur une valeur de filtre est parfaitement parfaitement solide. Vous pouvez itérer la boucle et les compter et vous pouvez itérer la boucle et renvoyer le nième objet.


4 commentaires

Un peu de code selon votre réponse serait vraiment très utile.


Vous pouvez configurer quelque chose pour filtrer les entrées dans l'adaptateur, même ce que vous avez là-bas devrait fonctionner. Ma meilleure suggestion à vous est issue des éléments les plus élémentaires qui devraient évidemment travailler à un élément plus complexe. Et perdre la fixation rapide pour que vous puissiez travailler les autres bits.


Je suis incapable de comprendre où utiliser la réponse d'Abhi et aussi ce que vous dites comme je ne suis pas encore beaucoup de bon développeur Android. S'il vous plaît, aide du très fondamental comme quoi et comment dois-je faire?


Vous écrivez un recycleradapter standardish et filtrez simplement les données qui le recule en fonction de la norme.



4
votes

Si vous voulez continuer à utiliser FASTADAPTER, il dispose d'une fonctionnalité de filtres intégrée (voir le numéro de point 5 dans le README du projet . Notez que la méthode Filtre doit être appelée après avecfilterRedicate et non auparavant, comme indiqué là-bas). P> Edit - Après avoir souligné que je vous ai mal compris, voici mes instructions proposées actualisées:

Vous devez résoudre les logiques dont vous souhaitez afficher (à l'aide des cases à cocher dans la boîte de dialogue que vous avez mentionnée. Dans le commentaire) et transmettez cette information sur le filtre, par exemple: xxx

et où vous définissez l'adaptateur (avant que la ligne ci-dessus n'est appelée) avoir: xxx


ancienne réponse

à partir de quand je pensais que vous vouliez filtrer les éléments en fonction de leur ms Valeurs longues, à l'aide d'un indicateur externe l long:

dans votre code, en supposant que votre application accède à la e si vous avez mentionné dans la question quand il devrait - supprimer le fasttitemadapter.clear (); et au lieu de la boucle pour avec le Si à l'intérieur, écrivez xxx

et quelque part avant que, de préférence où vous définissez l'adaptateur (le plus probable dans le onecreate de MainAlactivité ) ajoutez ce qui suit: xxx

(supposant ici que grmodeclass est vos articles ' classe et que le LONG MS est le long que vous avez fait référence à cela devrait déterminer si le)


6 commentaires

l est une liste et ne peut pas être écrit comme fastemadapter.filter (long.tostring (L)); : /


Donc, je ne vous ai probablement pas compris correctement. Je pensais l est une autre valeur unique, prise de quelque part ailleurs et devrait déterminer si nous devons afficher toutes les cartes qui ont ms inférieure à 1000 ou ceux qui ont Un MS de valeur supérieure ou égale à 1000. Est-ce que je me trompe? Si oui, veuillez répondre ici et mettre à jour votre question.


J'ai clairement mentionné dans la question que l est ces valeurs 11122, 12321, -98811, 8870, -88009, 3398 et -22113 . Voir les deux fichiers ici: Quelle est la variable booléenne qui détermine si vous souhaitez afficher les cartes avec l <1000 ou celles avec l> = 1000 ?


Il n'y a pas de valeur booléenne. Comme vous pouvez le constater dans le lien, j'ai fourni une boîte de dialogue montrée 2 Cochez la case , puis l'utilisateur a choisi quelles cartes à voir.


Je ne veux pas jouer avec tout votre code. J'essaie de répondre à la question spécifique que vous avez posée. Je ne veux pas entrer dans la logique intérieure du moment où vous souhaitez afficher chaque ensemble de cartes. Résoudre la condition vous-même, puis utiliser la réponse que je viens de mettre à jour à la manière dont je comprends votre question maintenant (chaque élément dispose d'une valeur l qui devrait déterminer s'il est affiché ou non basé sur une condition - quelque chose sur le dialogue et les cases à cocher - Je vous laisserai ces détails).



3
votes

Je suppose que votre classe est comme xxx

maintenant, j'espère que vous avez une fonction appelée lorsque vous mettez un filtre dans votre recyclerview . Laissez le nom de la fonction est togglefilter . xxx


2 commentaires

N'y a-t-il pas besoin d'écrire cette ligne quelque part: fastemadapter.filter (conditions); ?


Nan. Je suppose. As-tu essayé?



0
votes

Vous pouvez filtrer lors de la récupération de Firebase.

l <= 1000 xxx

l> 1000 xxx


0 commentaires