web-dev-qa-db-ja.com

RecyclerViewの最後のアイテムが画面に表示されていることを確認するにはどうすればよいですか?

RecyclerViewが1つあり、RecyclerViewにデータのリストを追加しました。最後のRecyclerViewアイテムが画面に表示されるときに、リストにさらにデータを追加したかった。その後、Webサービスを呼び出してRecyclerViewデータを更新します。どうすればこれを達成できますか?

助言がありますか?

17
Rajesh Koshti

これを実現するにはいくつかの方法がありますが、1つの方法は、アダプターのonBindViewHolderメソッドを使用することです。

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (position == mData.length - 1) {
            // load more data here.
        }

        /// binding logic
    }

データソースの最後の位置でbindメソッドが呼び出された場合、これは最後のセルが表示されようとしていることを示しており、リロードコールをトリガーする良いタイミングです。まだ追加のデータをロードしていないことを確認するために、条件に追加のセーフガードを追加する必要があるかもしれませんが、これは開始するのに役立つはずです。

別のオプションには、LayoutManagerの編集が含まれます。ここでのアイデアは、最後に表示されるアイテムの位置を見つけることです。その位置がデータセットの最後のアイテムと等しい場合、リロードをトリガーする必要があります。この呼び出しはLayourManager'sonLayoutChildrenscrollVerticallyBy(垂直スクロールを使用する場合)メソッド:

    @Override
    public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {

        final int result = super.scrollVerticallyBy(dy, recycler, state);

        if (findLastVisibleItemPosition() == mData.length - 1) {
           loadMoreData();
        } 

        return result;

    }

    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
        super.onLayoutChildren(recycler, state);

        if (findLastVisibleItemPosition() == mData.length - 1) {
           loadMoreData();
        } 
    }

前と同じように、データの読み込みを複数回トリガーしないようにする必要があります。この条件は複数回発生する可能性があるためです。

お役に立てれば!

18
Gil Moshayof

誰かがこの投稿を偶然見つけた場合 これは 簡単で簡単なチュートリアル:

あなたがする必要があるのは:

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) {
        super.onScrolled(recyclerView, dx, dy);
        int visibleItemCount        = lm.getChildCount();
        int totalItemCount          = lm.getItemCount();
        int firstVisibleItemPosition= lm.findFirstVisibleItemPosition();

        // Load more if we have reach the end to the recyclerView
        if ( (visibleItemCount + firstVisibleItemPosition) >= totalItemCount && firstVisibleItemPosition >= 0) {
            loadMoreItems();
        }
    }
});

次に、loadMoreItems()は次のようになります。

private void loadMoreItems() {
    // init offset=0 the frist time and increase the offset + the PAGE_SIZE when loading more items
    queryOffset = queryOffset + PAGE_SIZE;
    // HERE YOU LOAD the next batch of items
    List<Items> newItems = loadItems(queryOffset, PAGE_SIZE);

    if (newItems.size() > 0) {
        items.addAll(newItems);
        adapter.notifyDataSetChanged();
    }
}
7
velval