gpt4 book ai didi

android - 如何从 RecyclerView 清除数据监听器/订阅?

转载 作者:行者123 更新时间:2023-11-30 05:12:59 25 4
gpt4 key购买 nike

<分区>

注意:请不要建议将 FirebaseUI 作为答案。

我正在尝试设计一个聊天列表用户界面。为此,我将数据填充到我的 recyclerview,它显示聊天组列表以及最后一条消息。我希望实时更新最后一条消息。因此,为了做到这一点,我在 onBindViewHolder 方法中设置了一些监听器/订阅,它们不断地监听新数据并更新 View 。

我面临的问题是,如果用户迁移到其他 Activity ,当数据库中的聊天列表数据发生变化时,应用程序会崩溃。这是因为监听器仍在后台运行并尝试更新已销毁 Activity 的 View 。

我正在寻找一种方法来在 recyclerview 被销毁时关闭我的听众/订阅。我试过使用 onViewDetachedFromWindow 但它只适用于回收器在屏幕上时回收的 View 。如果我只读取一次数据,我会在订阅完成后立即清理它们,但我的用例是持续监听数据的变化。

一些示例代码:

protected void onBindViewHolder(@NonNull ChatViewHolder holder,
int position, @NonNull FirebaseConversationRecord model) {
final CardView cardView = (CardView) holder.itemView;
...
final ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Log.v("FIREBASEADAPTERLISTENER", dataSnapshot.getKey());
FirebaseUserRecord data = dataSnapshot.getValue(FirebaseUserRecord.class);
textViewName.setText(data.getName());

GlideApp.with(cardView.getContext())
.load(data.getProfilePicURL())
.into(imageView);
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.v("FIREBASEADAPTERLISTENER", databaseError.getMessage());
}
};
...
}

编辑这个问题是关于 RecyclerView 的上下文以及如何在 onBindView 期间附加监听器。它与从 Activity 中添加/删除单个监听器不同,后者可以非常直接地实现。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com