【问题标题】:Swipe to refresh Firebase database滑动以刷新 Firebase 数据库
【发布时间】:2018-01-19 17:23:44
【问题描述】:

当我向数据库写入内容时,它会出现在设备上,但是当我从数据库中删除它时,它会一直保留在应用程序中,直到我剪切应用程序。

当我想刷新 Firebase 数据库时应该编写什么代码?( 使用 swipeRefreshLayout)

swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            swipeRefreshLayout.setRefreshing(true);

        }
    });

我要写什么?

我写入数据库:“示例文本” 应用程序将显示:“示例文本”,然后我从数据库中删除了文本:“示例文本”,但应用程序仍然显示:“示例文本”。我需要 swipeRefreshLayout,因为我需要在应用程序中刷新数据库。

问题: 当使用 SwipeRefreshLayout 从数据库中删除数据时,如何刷新我的 UI。

【问题讨论】:

  • 请提供更多细节。显示的数据是什么?
  • 在列表视图中......
  • 只是一个问题....为什么要在将其从设备中删除之前将其从后端删除?我认为用户将无权访问后端。
  • 我不知道,你的意思。

标签: android firebase firebase-realtime-database


【解决方案1】:

实现这一点的最简单方法是使用这行代码告诉适配器您的数据已更改:

adapter.notifyDataSetChanged();

对于 Firebase,更常见的做法是使用 FirebaseUI。该库将为您处理所有事件,例如添加、删除或更新的项目。

【讨论】:

    【解决方案2】:

    您必须使用 UI 中显示的实时或实时更新数据条目来删除或刷新它,只需使用这些回调简单检查数据是否存在。

    示例代码:用于监听实时更新(插入或删除)

    ChildEventListener childEventListener = new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
        // ...
    }
    
    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
        // ...
    }
    
    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {
        // ...
    }
    
    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
        // ...
    }
    
    @Override
    public void onCancelled(DatabaseError databaseError) {
        // ...
    }
    

    };

    这是您对子参考的查询

    Query query = FirebaseDatabase.getInstance()
            .getReference()
            .child("chats")
            .limitToLast(50);
    query.addChildEventListener(childEventListener);
    

    当您对所有情况都有回调时,无需使用滑动刷新。

    【讨论】:

    • 跟SwipeRefreshLayout有关系吗?
    • 不,它的 firebase 代码回调用于删除或更新实时数据。
    • 但是当我复制这段代码并插入到我的项目中时,这段代码:query.addChildEventListener(childEventListener); (childEventListener) 带有红色下划线。而@Override public void onCancelled(DatabaseError databaseError) { // ... } 也覆盖
    【解决方案3】:

    遇到了同样的问题,就像之前说的,您可以使用 firebase 代码回调来执行此操作,这些链接可能会对您有所帮助。

    这是一个 Udacity course 用于 firebase。

    Here你也可以看到如何实现这些代码回调,因为Udacity course只是展示了onChildAdded方法。

    这里有一个指向Firebase codelabs 的链接,它为我解决了这个问题。

    如果一切正常,你的FirebaseRecyclerAdapter 应该像这样被实例化,对吧?

    private FirebaseRecyclerAdapter<FriendlyMessage, MessageViewHolder>
            mFirebaseAdapter;
    

    然后在你的 onPause 和 onResume 方法中,就像这里显示的那样,每次你添加、删除或更改你在数据库中收听的任何数据时,它都会立即显示在应用程序中。

    @Override
    public void onPause() {
        mFirebaseAdapter.stopListening();
        super.onPause();
    }
    
    @Override
    public void onResume() {
        super.onResume();
        mFirebaseAdapter.startListening();
    }
    

    这样您就不需要SwipeRefreshLayout。 试试看。有效吗?

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • @KarolisKoncevičius 感谢您的反馈,现在它包含了所需代码的基本部分。如果有帮助请分享答案。
    猜你喜欢
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多