Java 如何阻止从Firebase数据库填充并由FirebaseRecyclerAdapter管理的RecyclerView重新创建已删除的视图?
问题背景: (一) 我在社交媒体克隆应用程序方面遇到了问题,特别是用户提要(在recyclerView中)和操作帖子(在ViewHolder类中) (二) 视图是从Firebase实时数据库填充的 (三) 创建“post”功能正常(所有信息都正确传递给Firebase并加载到回收器中) (四) 我可以使用以下方法从Firebase中删除帖子:Java 如何阻止从Firebase数据库填充并由FirebaseRecyclerAdapter管理的RecyclerView重新创建已删除的视图?,java,android,firebase-realtime-database,android-recyclerview,Java,Android,Firebase Realtime Database,Android Recyclerview,问题背景: (一) 我在社交媒体克隆应用程序方面遇到了问题,特别是用户提要(在recyclerView中)和操作帖子(在ViewHolder类中) (二) 视图是从Firebase实时数据库填充的 (三) 创建“post”功能正常(所有信息都正确传递给Firebase并加载到回收器中) (四) 我可以使用以下方法从Firebase中删除帖子: firebaseRecyclerAdapter.getRef(postsViewHolder.getAdapterPosition()).removeVa
firebaseRecyclerAdapter.getRef(postsViewHolder.getAdapterPosition()).removeValue();
但是,如果在删除以前的帖子后创建新帖子,则以前删除的帖子将重新出现在数据库和回收器中
问题观察:
(一)
这看起来好像文章的本地副本存储在一个数组中(我没有创建数组,所以必须有由datasnapshot或其他东西触发的默认数组)
(二)
如果我能以某种方式重置这个隐藏数组的索引,我相信问题会得到解决。对于每个应用程序会话,recyclerView被确定为填充与当前会话中相同数量的帖子。为了澄清,我可以发表文章、重新加载会话、删除它、发表另一篇文章,而被删除的文章将不会再次出现
问题尝试:
我试过使用
1) newsFeedRecycler.getRecycledViewPool().clear();
2) firebaseRecyclerAdapter.notifyItemRangeRemoved(0,firebaseRecyclerAdapter.getItemCount());
3) postsViewHolder.itemView.destroyDrawingCache();
4) newsFeedRecycler.setAdapter(firebaseRecyclerAdapter);
5) firebaseRecyclerAdapter.notifyDataSetChanged();
6) firebaseRecyclerAdapter.notifyItemRemoved(postsViewHolder.getAdapterPosition());
在3天的时间里,我们将尝试从本地内存和Firebase中有效地删除已删除的帖子
问题上诉:
我对Java非常陌生,并且已经从实践中了解到了我现在所知道的东西,因此我对这个问题的理解可能缺少了一些东西。然而,我知道这个问题并不是重复的,因为我已经尝试了几乎所有可以在堆栈溢出上找到的解决方案,甚至远程解决了这个问题。如果有人能帮助我了解问题所在以及如何解决问题,我将不胜感激。干杯对于未来的观众,我实际上能够通过添加一个看似很小的细节来解决我的问题(我记得我在另一个答案中看到了这一点,但解决了一个不同的问题)。最初,我的“上传帖子”方法是这样的:
private void uploadPostInfo() {
userReference.child(currentUserID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
HashMap postsMap = new HashMap();
postsMap.put("timestamp", formattedDate);
postsMap.put("uid",currentUserID);
postsMap.put("postText",postText);
postsMap.put("postImage",downloadUrlImage);
postsMap.put("postFile",downloadUrlFile);
postsReference.child(currentUserID + formattedDate).updateChildren(postsMap)
}
无论如何,这看起来是正确的。但是,使用“addValueEventListener”会添加post的所有缓存值。解决此问题的正确方法是将侦听器限制为单个事件-使用addSingleValueEventListener(new ValueEventListener(){
而不是addValueEventListener(new ValueEventListener(){
)
同样对于未来的观众来说,以前在管理帖子时影响我的应用程序一致性的另一个问题(使这个问题变得更加复杂)是,我的帖子“键”使用getRef(),直接从内部onClick()调用中获取OnBindViewholder()的“position”参数作为“用户提要”的一部分活动。例如:
OnBindViewHolder:
受保护的无效onBindViewHolder(@NonNull final PostsViewHolder PostsViewHolder,final int position,@NonNull final Posts model){
检索之前的键:PostKey=getRef(position).getKey();
在以下项之后检索键:PostKey=getRef(postsViewHolder.getAdapterPosition()).getKey();
据我所知,这是必需的,因为如果直接使用
position
确定post键值,position
只能在重新绑定后获取新值,但是(postsViewHolder.getAdapterPosition()
可以在不重新绑定的情况下检索职位。您清楚地提出了问题,但您必须提供一些代码。主要是适配器代码
和创建新帖子的代码。感谢您的建议Hasan。通过对与我的问题相关的代码进行排序,我能够解决我的问题苏。我将在下面发布我的解决方案(包括代码)。干杯