【问题标题】:How to implement load more Pagination(infinite scrolling) on RecyclerView using data from Firebase database如何使用 Firebase 数据库中的数据在 RecyclerView 上实现加载更多分页(无限滚动)
【发布时间】:2020-12-28 22:58:01
【问题描述】:

我正在尝试实现加载更多分页(无限滚动)。我正在从 Firebase 实时数据库获取数据。

数据正在RecyclerView中使用。

当用户滚动时,我想在他到达 recyclerView 的末尾时再加载 10 个项目。

我试图在互联网上找到解决方案,但没有找到任何解决方案。

这是我的 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<>();

    }

}

【问题讨论】:

    标签: java android firebase firebase-realtime-database android-recyclerview


    【解决方案1】:

    这不起作用: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

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 2021-08-29
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多