Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何阻止从Firebase数据库填充并由FirebaseRecyclerAdapter管理的RecyclerView重新创建已删除的视图?_Java_Android_Firebase Realtime Database_Android Recyclerview - Fatal编程技术网

Java 如何阻止从Firebase数据库填充并由FirebaseRecyclerAdapter管理的RecyclerView重新创建已删除的视图?

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

问题背景:

(一) 我在社交媒体克隆应用程序方面遇到了问题,特别是用户提要(在recyclerView中)和操作帖子(在ViewHolder类中)

(二) 视图是从Firebase实时数据库填充的

(三) 创建“post”功能正常(所有信息都正确传递给Firebase并加载到回收器中)

(四) 我可以使用以下方法从Firebase中删除帖子:

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。通过对与我的问题相关的代码进行排序,我能够解决我的问题苏。我将在下面发布我的解决方案(包括代码)。干杯