来自说分页适配器不适合聊天应用程序的文档,所以我尝试在 swipeTorefreshLayout 中进行分页
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
mItemPosition=0;
int difference =(int)size-messagesList.size();
if(difference>10){
page_size =10;
}else {
page_size=difference+1;
}
if(difference>0){
fetchMoreMessages();
}else {
swipeRefreshLayout.setRefreshing(false);
}
}
});
我还使用了 limitToLast 方法来获取 fetchMesages 方法中的 10 条最新消息
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
if (snapshot.exists()) {
Messages messages = snapshot.getValue(messages.class)
mItemPosition++;
if(mItemPosition==1){
mLastKey =snapshot.getKey();
mPrevKey = snapshot.getKey();
}
messagesList.add(messages);
adapter.notifyDataSetChanged();
mRecyclerView.smoothScrollToPosition(messagesList.size() - 1);
swipeRefreshLayout.setRefreshing(false);
}
messageQuery = pairRef.orderByKey().limitToLast(10);
messageQuery.addChildEventListener(mChildEventListener);
fetchMoreMessages 方法
if(moreChildEventListener ==null){
moreChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
if (snapshot.exists()) {
Messages messages = snapshot.getValue(messages.class)
if(!messageKey.equals(mPrevKey)){
messagesList.add(mItemPosition++,messages);
}else {
mPrevKey = mLastKey;
}
}
if(mItemPosition==1) {
mLastKey = snapshot.getKey();
}
adapter.notifyDataSetChanged();
swipeRefreshLayout.setRefreshing(false);
问题是,当我添加一条新消息时,它会在最后一条消息之后的正确位置显示两次,另一条将显示两条消息,即我之前在 limitToLast 方法()中显示的消息,并在其下方显示新消息>
messag10
messag2
messag3
new message
message10
new message
如果我重新启动活动,它会显示它应该是(一条消息)这也用于删除 我认为这个问题是因为使用 limitTolast() 我花了很多时间来寻找解决方案并创建分页,那么如何做到这一点,或者是否有另一种添加分页的最佳方法?感谢任何帮助
答案 0 :(得分:0)
我个人在使用分页时不使用适配器,当用户到达 ListView 的底部时,我只是将当前列表大小发送到我的服务层。似乎是一个不那么密集和更高效的过程,那么你只需要实现 SKIP 和 TAKE 到 db
private boolean reachedEndOfList(int position)
{
return position == this.getCount() - 1;
}
答案 1 :(得分:0)
你可以试试这个方法
private void myRecyclerUpdater() {
mRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener() {
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { //not important
super.onScrolled(recyclerView, dx, dy);
}
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//try (2) instead of ACTION_DOWN if it didnt work
//and we check for scroll state here 0 means IDLE
if (!recyclerView.canScrollVertically(MotionEvent.ACTION_DOWN) && newState == 0) {
//make your data request
//update your recycler list and notify changes
}
}
});
}