问题描述
我正在尝试实现加载更多分页(无限滚动)。我正在从 Firebase实时数据库获取数据。
数据正在 RecyclerView 中使用。
当用户滚动时,我想在到达recyclerView末尾时再加载10个项目。
我试图在Internet上找到解决方案,但是没有找到任何解决方案。
这是我的MainActivity:-
public class MainActivity extends AppCompatActivity {
private ArrayList<CoffeeItem> coffeeItems;
private CoffeeAdapter coffeeAdapter;
private Context context = MainActivity.this;
static RecyclerView recyclerView;
private DatabaseReference reference;
private StorageReference mStorageRef;
GridLayoutManager manager;
private int currentPage = 1;
private static final int TOTAL_ITEM_EACH_LOAD = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
manager = new GridLayoutManager(this,2);
coffeeItems = new ArrayList<>();
recyclerView.setLayoutManager(manager);
reference = FirebaseDatabase.getInstance().getReference();
mStorageRef = FirebaseStorage.getInstance().getReference();
recyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(manager) {
@Override
public void onLoadMore(int current_page) {
loadMoreData();
}
});
init();
}
private void init() {
clearAll();
Query query = reference.child("Images");
query.limitToFirst(TOTAL_ITEM_EACH_LOAD);
query.startAt(currentPage*TOTAL_ITEM_EACH_LOAD);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
CoffeeItem coffeeItem = new CoffeeItem();
coffeeItem.setUrl(snapshot.child("url").getValue().toString());
coffeeItem.setDescription(snapshot.child("description").getValue().toString());
coffeeItems.add(coffeeItem);
}
coffeeAdapter = new CoffeeAdapter(coffeeItems,context);
recyclerView.setAdapter(coffeeAdapter);
recyclerView.setItemAnimator(new DefaultItemAnimator());
coffeeAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void loadMoreData(){
currentPage++;
init();
}
private void clearAll() {
if (coffeeItems != null){
coffeeItems.clear();
if (coffeeAdapter != null) {
coffeeAdapter.notifyDataSetChanged();
}
}
coffeeItems = new ArrayList<>();
}
}
解决方法
这不起作用:query.startAt(currentPage*TOTAL_ITEM_EACH_LOAD)
。 Firebase查询不是基于偏移量,而是基于知道从哪个项目开始。
在Firebase中进行分页的方法:
- 根据项的键,值或子属性的值对项进行排序。如果您没有特定的订购需求,请使用
orderByKey()
。 - 处理数据库中的项目时,请跟踪最后一个项目的值和键。如果您通过钥匙订购,则只需要钥匙。
- 要加载下一页项目时,请将最后一个值和键传递到
startAt
中。
Firebase中已经有关于分页的数百个问题,因此我建议您检查一下:https://stackoverflow.com/search?q=%5Bfirebase-realtime-database%5D%5Bandroid%5D+pagination