如何使用Firebase数据库中的数据在RecyclerView上实现更多加载分页无限滚动

问题描述

我正在尝试实现加载更多分页(无限滚动)。我正在从 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中进行分页的方法:

  1. 根据项的键,值或子属性的值对项进行排序。如果您没有特定的订购需求,请使用orderByKey()
  2. 处理数据库中的项目时,请跟踪最后一个项目的值和键。如果您通过钥匙订购,则只需要钥匙。
  3. 要加载下一页项目时,请将最后一个值和键传递到startAt中。

Firebase中已经有关于分页的数百个问题,因此我建议您检查一下:https://stackoverflow.com/search?q=%5Bfirebase-realtime-database%5D%5Bandroid%5D+pagination

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...