在FirebaseRecyclerAdapter上更改数据的最佳方法

时间:2016-10-03 17:42:41

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

目前我正在使用 FirebaseRecyclerAdapter 使用以下Firebase查询来表示RecyclerView上的数据:

start 2016-09-09 12:42:15, end 2016-09-10 03:29:51, time span 14:47:36

我的RecyclerView有一个包含2个按钮的标题:新列表,旧列表。 默认情况下会加载新列表,我的问题是,当用户点按旧列表按钮时, 用旧列表 替换新列表的最有效方法是什么?

旧列表的Firebase查询如下所示:

postsQuery = mDatabase.child("lists_new”).orderByKey().limitToFirst(10);

注意:新列表和旧列表都具有相同的数据类型,即它们共享相同的Java POJO类和相同的布局。

2 个答案:

答案 0 :(得分:3)

您需要一个新的适配器并将其连接到同一个RecyclerView。

因此,在构造新查询之后,您将创建一个新适配器并将其附加到视图:

adapter = new FirebaseRecyclerAdapter<Chat, ChatHolder>(
   Chat.class, android.R.layout.two_line_list_item, ChatHolder.class, postsQuery) {
recyclerView.setAdapter(adapter);

答案 1 :(得分:1)

我有一个类似的需求和类似的解决方案,除了我在适配器上调用cleanup()之前新的另一个。我在想没有调用cleanup()会导致适配器和/或监听器泄漏吗?

在我的Fragment中的onActivityCreated()中,我在Fragment中调用一个管理Recycler视图的方法。调用方法初始化或刷新列表并传入叶节点名称。如果适配器不为null,则调用cleanup()。通过将新叶节点与父引用连接,新建一个新适配器并设置它来创建新的数据库引用。

我也常常在onDestroy()中调用cleanup()。

到目前为止它工作正常但我只使用模拟器和一个小数据集进行了测试。

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    refreshList(newLeafNode);
}

@Override
public void onDestroy() {
    super.onDestroy();
    mRVAdapter.cleanup();
}

protected void refreshList(String newLeafNode) {

    if (mRVAdapter != null) {
        mRVAdapter.cleanup();
    }

    DatabaseReference newDbRef = mParentRef.child(newLeafNode);

    mRVAdapter = new FirebaseRecyclerAdapter<String, MyViewHolder>(String.class, R.layout.single_row, MyViewHolder.class, newDbRef) {
        @Override
        protected void populateViewHolder(MyViewHolder viewHolder, String model, int position) {
            viewHolder.setImage(model);
        }
    };
    mMyRV.setAdapter(mRVAdapter);
}