Android RecyclerView没有';改变后,我们不能保持不变

Android RecyclerView没有';改变后,我们不能保持不变,android,android-recyclerview,Android,Android Recyclerview,我在向RecyclerView元素中删除或添加项时遇到问题,问题不在于添加或删除本身,因此我解释了这种情况 我有一个回收器和一个添加元素的按钮,如果用户按下一个视图,它会显示一个包含删除按钮和其他内容的对话框。我可以在回收器视图中添加和/或删除项目,使用notifyDataSetChanged(),视图更新正常,但当我按后退按钮时(仅通过这样做,而不是任何其他方式),视图会再次出现(在删除的情况下)或消失(如果我添加),将回收器设置为更改前的状态,我不希望出现这种行为,因为我创建的delete和

我在向RecyclerView元素中删除或添加项时遇到问题,问题不在于添加或删除本身,因此我解释了这种情况

我有一个回收器和一个添加元素的按钮,如果用户按下一个视图,它会显示一个包含删除按钮和其他内容的对话框。我可以在回收器视图中添加和/或删除项目,使用
notifyDataSetChanged()
,视图更新正常,但当我按后退按钮时(仅通过这样做,而不是任何其他方式),视图会再次出现(在删除的情况下)或消失(如果我添加),将回收器设置为更改前的状态,我不希望出现这种行为,因为我创建的delete和add方法不仅仅是添加/删除视图,还包括数据库中的关联数据,所以如果我在删除后按view,应用程序会崩溃,因为不再有这样的数据,但视图仍然存在

所有这些内容都在一个导航抽屉可以访问的片段内,如果我导航其他片段并再次返回到这个片段,则按back键不会再影响回收器,并且所有这些“重影”视图都会消失,因为数据是从数据库重新加载的。 我需要一个som帮助来避免这种情况,我知道撤销删除可以完成,但我不想,我只想删除数据

更新:这正是发生的情况,在“回收器”视图中项目的消失/重新出现是由按下“后退”按钮造成的

这一个显示了添加后的消失

这一个显示删除后的重新出现

更新2:我通过使用谷歌文档覆盖onBackPressed方法解决了这个问题,当backpressed时,我做的是导航到导航中的第一个片段,这不是我想要的,而是暂时解决了问题(作为补丁),我仍然在寻找答案


更新3:发布了我自己的答案,解决了所有问题,没有使用onBackPressed,效果很好,我意识到一些奇怪的行为

您的列表不同步。您有两个列表,一个用于保存传递给回收器的对象集合的引用,另一个位于回收器内,用于迭代并绘制视图持有者

我建议一旦你删除|在DB旁边添加某个内容,将其添加到外部列表(一个外部回收商)中,并将整个列表传递给回收商。这样,您将确保回收商的列表始终是最新的


这不是最好的解决方案,其他可能的解决方案可能包括RX支持的Db,没有中间调用来调用回收器

您可能会注意到,我的应用程序有一个导航抽屉,当我试图通过重写片段中的onBackPressed()来解决问题时,我试图返回导航抽屉中的第一个片段,在这样做时,我意识到一个我以前没有意识到的错误:

NavigationUI.onNavDestinationSelected(菜单项,导航控制器)

该行在NavigationItemSelectedListener中重复:

        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull final MenuItem menuItem) {
                int id=menuItem.getItemId();
                //this line indicates the action of changing fragment using navController reference
                NavigationUI.onNavDestinationSelected(menuItem,navController);
                if (id==R.id.nav_cuanto){
                    Handler mHandler = new Handler();
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {drawer.closeDrawer(GravityCompat.START);}
                    },300);
                }
                if(id==R.id.nav_reportes){
//                    NavigationUI.onNavDestinationSelected(menuItem,navController);  -> this line caused the hole problem
                    Handler mHandler = new Handler();
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {drawer.closeDrawer(GravityCompat.START);}
                    },300);
                }
                if(id==R.id.nav_about){
                    Handler mHandler = new Handler();
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            drawer.closeDrawer(GravityCompat.START);
                        }
                    },300);
                }
                return true;
            }
        });
我删除了这一行,一切正常,正如预期的那样,这个特殊的方法创建了一个新的你试图导航到的片段实例,但问题是,当你试图导航到你已经在的片段时,它创建了一个新的实例,一个导航到它的实例,而这个新实例位于旧实例之上,因此,当按下back键时,应用程序不会返回到以前的视图,而是返回到与旧视图相同的片段(当然是过时的),我无法想象这种行为,这是非常不可想象的,而且它不在视图中,所以我几乎死都在试图理解它。因此警告:如果有人试图使用

NavigationUI.onNavDestinationSelected(菜单项,导航控制器)


请勿在同一通话中多次使用,如果是这样,在最佳情况下,您需要按两次后退:-(

已经这样做了,但这不是它正在发生的事情,回收器确实更新了ok,但当我按下后退按钮时,它会返回到上一个视图,实际上我根本没有对这部分进行编码,它可能是一些默认行为或其他什么,但我不知道如何禁用它,如果按下后退按钮时你会怎么做?这个方法不是d根据我的定义,我甚至不知道在碎片上是否有这样的方法