Android 进行Firebase查询时遇到问题
我在android中使用回收器视图实现无休止的滚动时遇到了问题。基本上,我想要的是像instagram这样的东西,你可以无休止地滚动页面 我有一个Firebase数据库,其中有10个项目,我想显示3个项目,并为接下来的两个项目充电,然后当您滚动查看接下来的两个项目时,开始加载接下来的5个项目,以此类推。(您将看到示例中的大部分内容都是硬编码的) 我在进行Firebase查询时遇到以下问题:Android 进行Firebase查询时遇到问题,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我在android中使用回收器视图实现无休止的滚动时遇到了问题。基本上,我想要的是像instagram这样的东西,你可以无休止地滚动页面 我有一个Firebase数据库,其中有10个项目,我想显示3个项目,并为接下来的两个项目充电,然后当您滚动查看接下来的两个项目时,开始加载接下来的5个项目,以此类推。(您将看到示例中的大部分内容都是硬编码的) 我在进行Firebase查询时遇到以下问题: myRef.orderByChild("id").startAt(page*5 + "").endAt(5
myRef.orderByChild("id").startAt(page*5 + "").endAt(5+page*5 + "")
我想得到的是,在我目前的位置,接下来的5件物品的id介于-5和10之间。但是,当我这样做时:
myRef.orderByChild("id").startAt(page*5 + "").endAt(5+page*5 + "")
.getRef().addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int i = 0;
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
if(i == 5) break;
mDataset.add(postSnapshot.getValue(Card.class));
i++;
}
mAdapter = new CustomAdapter(mDataset);
mRecyclerView.setAdapter(mAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
所有PostSnapshot都返回ID 1、2、3、4、5。制造出无休止滚动的幻觉,但每次收费相同的5项
谢谢
编辑:
EndlessScrollListener
public abstract class EndlessScrollListener extends RecyclerView.OnScrollListener {
private int mVisibleThreshold = 2,
mCurrentPage = 0,
mPreviousTotalItemCount = 0,
mStartingPageIndex = 0;
private boolean mLoading = true;
RecyclerView.LayoutManager mLayoutManager;
public EndlessScrollListener(){}
public EndlessScrollListener(LinearLayoutManager layoutManager){
mLayoutManager = layoutManager;
}
public EndlessScrollListener(int visibleThreshold){
mVisibleThreshold = visibleThreshold;
}
public int getLastVisibleItem(int[] lastVisibleItemPositions){
int maxSize = lastVisibleItemPositions[0];
for(int i = 1; i < lastVisibleItemPositions.length; ++i){
if(lastVisibleItemPositions[i] > maxSize)
maxSize = lastVisibleItemPositions[i];
}
return maxSize;
}
@Override
public void onScrolled(RecyclerView view, int dx, int dy){
int lastVisibleItemPosition = 0,
totalItemCount = mLayoutManager.getItemCount();
if (mLayoutManager instanceof LinearLayoutManager) {
lastVisibleItemPosition =
((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition();
}
if(totalItemCount < mPreviousTotalItemCount){
mCurrentPage = mStartingPageIndex;
mPreviousTotalItemCount = totalItemCount;
mLoading = totalItemCount == 0;
}
if(mLoading && totalItemCount > mPreviousTotalItemCount){
mLoading = false;
mPreviousTotalItemCount = totalItemCount;
}
if(!mLoading && (lastVisibleItemPosition + mVisibleThreshold) > totalItemCount){
mCurrentPage++;
onLoadMore(mCurrentPage, totalItemCount, view);
mLoading = true;
}
}
public abstract void onLoadMore(int page, int totalItemsCount, RecyclerView view);
public void resetState(){
mCurrentPage = mStartingPageIndex;
mPreviousTotalItemCount = 0;
mLoading = true;
}
}
如何确定
page
?@Drew page通过每次(lastVisibleItemPosition+MVVisibleThreshold)>TotalItemCountThank@Levon上的ScrollListener来确定,您能用ScrollListener更新您的原始帖子吗?完整的代码将使确定问题变得更容易
scrollListener = new EndlessScrollListener(mLayoutManager) {
@Override
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
System.out.println("Dale... Page: " + page + " items: " + totalItemsCount);
loadData(page);
}
};