问题描述
我正在通过添加addOnScrollListener
函数来实现RecyclerView
的分页逻辑.
I am implementing pagination logic with RecyclerView
by adding addOnScrollListener
function.
在 dy 值为0的情况下加载RecyclerView适配器时,将调用一次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);
}
我的Recycler 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()没有被叫
在使用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方法仅被调用一次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!