20

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

助言がありますか?

4

5 に答える 5

19

1 つのオプションには、LayoutManager. ここでの考え方は、最後に表示されたアイテムの位置を見つけることです。その位置がデータセットの最後のアイテムと等しい場合は、リロードをトリガーする必要があります。

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

別の方法として、アダプターのメソッドを使用してこれを行うこともできますがonBindViewHolder、これは確かに少し「ハック」です。

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

        /// binding logic
    }

3 番目のオプションは、OnScrollListener を RecyclerView に追加することです。このページの@velvalの回答は、これをよく説明しています。

どちらのオプションを使用する場合でも、データ ロード ロジックが何度もトリガーされるのを防ぐためのコードを含める必要があります (たとえば、より多くのデータを取得する前の要求が完了し、新しいデータが返される前)。

于 2016-01-26T09:42:02.173 に答える
0

Android - RecyclerView の最後のアイテムが表示されたときに検出するも参照してください。

private fun isLastItemVisible(): Boolean {
    val layoutManager = recycler_view.layoutManager
    val position = layoutManager.findLastCompletelyVisibleItemPosition()
    return position >= adapter.itemCount - 1
}
于 2020-08-07T13:42:48.067 に答える