web-dev-qa-db-ja.com

RecyclerView OnScrollListener()の問題

私はjsonに約32のレコードを持っています、私はそれらを表示するためにRecyclerViewを使用しており、OnScrollListener(...)を実装しました

質問

私はアクティビティを開始し、32レコードすべてをフェッチしました。スクロールすると、同じ32レコードを何度も何度も取得するのですが、スクロールするたびに、ここに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);
                    }
                }
            }
        });
    }
11
Oreo

実装は正しいようですが、1つの条件が失敗した場合は、dy> 0のときに次のように試してください(これもアクティビティのOnCreateに入れます)。

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

                }
            }
        }
    });
10

これを使用しています

 if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 

つまり、22件のレコードを表示すると、再度ロードすることになります。そして、再度ロードしている間、同じデータを取得してリストに追加しています。

RXjavaを使用していることがわかります。 loadPostでサブスクライブしているときに、オブザーバブルが出力しているデータを確認してください。私はそれが同じデータを再び放出すると思います、つまりあなたの32レコードとそれらのレコードが再び追加され、これは無限ループです。

1
Ragesh Ramesh

最後のアイテムに達したときに何かをトリガーする別の方法を次に示します

@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();