web-dev-qa-db-fra.com

RecyclerView OnScrollListener () Issue

J'ai environ 32 enregistrements dans json, j'utilise RecyclerView pour les afficher et j'ai implémenté OnScrollListener (...)

Question

J'ai commencé une activité, j'ai récupéré les 32 enregistrements. Maintenant, lorsque je fais défiler, pourquoi je reçois encore et encore les mêmes 32 enregistrements, chaque fois que je fais défiler, voici mon implémentation de OnScrollListener ()

public void initializeOnScrollForRecyclerView() {
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

                int visibleItemCount = recyclerView.getLayoutManager().getChildCount();
                int totalItemCount = recyclerView.getLayoutManager().getItemCount();
                int pastVisiblesItems = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();

                if (!isLoading) {
                    if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                        isLoading = true;
                        mPostPresenter.loadPosts(false);
                    }
                }
            }
        });
    }
9
Oreo

L'implémentation semble être correcte mais si une condition échoue, essayez quand dy> 0 comme ceci (mettez également ceci dans la création de l'activité):

    private boolean loading = true;

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }


        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy)
        {

            if (loading) {
                if (dy > 0) //check for scroll down
                {
                    visibleItemCount = layoutManager.getChildCount();
                    totalItemCount = layoutManager.getItemCount();
                    pastVisiblesItems = layoutManager.findFirstVisibleItemPosition();

                    if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                        loading = false;

                        Log.v("...", " Reached Last Item");
                        loadMoreVideos(searchVideos);
                    }

                }
            }
        }
    });
8

Vous utilisez ceci

 if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 

Ce qui signifie qu'une fois que vous avez visionné 22 enregistrements, vous chargez à nouveau. Et lors du chargement à nouveau, vous obtenez les mêmes données et les ajoutez à votre liste. 

Je peux voir que vous utilisez RXjava. Lorsque vous vous abonnez à loadPost, vérifiez quelles données votre observable émet. Je pense qu’il émet à nouveau les mêmes données, c’est-à-dire que vos 32 enregistrements sont ajoutés et que ces enregistrements sont ajoutés à nouveau. Il s’agit d’une boucle sans fin.

0
Ragesh Ramesh

Voici un autre moyen de déclencher quelque chose lorsque le dernier élément est atteint

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

    //When last item is reached
    if(position == yourList.size() - 1){
        loadMoreMessages();
    }
  }

public abstract void loadMoreMessages();
0