问题描述
我通过添加 addOnScrollListener
函数使用 RecyclerView
实现分页逻辑.
I am implementing pagination logic with RecyclerView
by adding addOnScrollListener
function.
onScrolled
方法在 RecyclerView 适配器以 dy 值为 0 加载时被调用一次.但是,当列表滚动到末尾时,onScrolled
方法未触发,而 onScrollStateChanged
已正确触发.
The onScrolled
method is called once when the RecyclerView adapter is loaded with dy value of 0. However when the list reaches its end when scrolled, the onScrolled
method is not triggered while the onScrollStateChanged
is triggered correctly.
这是我的适配器:
HistoryAdapter(Context context, ArrayList<HistoryItem> items, RecyclerView recyclerView) {
inflater = LayoutInflater.from(context);
this.items = items;
preferences = PreferenceManager.getDefaultSharedPreferences(context);
this.context = context;
this.recyclerView = recyclerView;
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
Timber.w("onScrolled.. %s", dy);
if (dy > 0) {
totalItemCount = linearLayoutManager.getItemCount();
lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
Timber.e("totalItemCount: %s", totalItemCount);
Timber.e("lastVisibleItem: %s", lastVisibleItem);
if (!isLoading && totalItemCount <= (lastVisibleItem + 1)) {
Timber.i("End reached...");
if (onLoadMoreListener != null) {
//Log.i(TAG, "Episodes Adapter: onLoadMore calling...");
onLoadMoreListener.onLoadMore();
}
isLoading = true;
}
}
}
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
});
}
回收商:
private void setupRecycler() {
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
historyAdapter = new HistoryAdapter(getActivity(), historyItems, recyclerView);
recyclerView.setAdapter(historyAdapter);
historyAdapter.setClickListener(this);
historyAdapter.setOnLoadMoreListener(this);
historyAdapter.setErrorClickListener(this);
}
我的回收站 xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/medium_text_color_blue"
android:padding="12dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start"
android:text="#"
android:textColor="@android:color/white"
android:textStyle="bold" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4.5"
android:gravity="start"
android:text="CLASS"
android:textAllCaps="true"
android:textColor="@android:color/white"
android:textStyle="bold" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="center"
android:text="Date"
android:textAllCaps="true"
android:textColor="@android:color/white"
android:textStyle="bold" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="center"
android:text="time"
android:textAllCaps="true"
android:textColor="@android:color/white"
android:textStyle="bold" />
</LinearLayout>
<FrameLayout
android:layout_below="@+id/header"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/no_reflection_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_gravity="center"
android:text="No Reflection History found!" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/history_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
</RelativeLayout>
我的研究:
StackOverflow 上已经发布了许多此类问题,但其中大多数都指向一个解决方案,即删除 RecyclerView
的父 ScrollView
,它停止了 onScrolled
方法被触发,但这似乎不是我面临的问题.
What I have researched:
There are many such issues already posted at StackOverflow but most of them point to a solution that is to remove the parent ScrollView
of the RecyclerView
which is stopping the onScrolled
method to be triggered, however this seems to be not an issue I am facing.
RecyclerView.onScrolled() 没有被调用
RecyclerView onScrolled 在使用 scrollToPosition 时不调用
RecyclerView onScrolled 根本没有被触发
RecyclerView 未在底部调用 onScrolled
android RecyclerView onScrolled 不调用
https://github.com/passsy/ArrayAdapter/issues/4
推荐答案
另一种方法是检查回收器是否可以垂直滚动,如果不能,则表示它已到达底部.
An alternative is to check if the recycler can scroll vertically if it cannot then it means it has reached the bottom.
试试这个
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (!recyclerView.canScrollVertically(1)) {
// Load more
}
}
}
`
这篇关于不调用 addOnScrollListener 的 RecyclerView onScrolled 方法,只调用一次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!