更改后,RecyclerView不会保持修改状态

时间:2019-11-27 19:27:24

标签: android android-recyclerview

在删除或添加项目到RecyclerView元素时遇到问题,问题不在添加或删除自身时,所以我解释这种情况。

我有一个回收站和一个向其中添加元素的按钮,如果用户按下视图,它将显示一个包含删除按钮和更多内容的对话框。我可以在回收者视图中添加和/或删除项目,并使用notifyDataSetChanged()更新视图,但是当我按下后退按钮(仅通过此操作,没有其他方法)时,视图再次出现(在删除的情况下)或消失(如果我进行了添加)(按照我的更改方式)来设置回收站,我不希望出现这种情况,因为我创建的delete和add方法不只是添加/删除视图,但也添加/删除数据库中的关联数据,因此,如果删除后按视图,则应用崩溃,因为不再有此类数据,但视图仍然存在。

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

更新:这正是发生的情况,在回收器视图中物品消失/重新出现是由按下后退按钮引起的

此图显示添加后消失 This one shows the vanishing after adding

此显示删除后重新出现 This one shows the reappearing after deleting

更新2:我已经使用Google的this文档覆盖了onBackPressed方法,从而解决了该问题,当我按下该键时,我会导航到导航中的第一个片段,这不是我想要的,但是暂时(作为补丁)解决了问题,我仍在寻找答案。

更新3:发布了我自己的答案,并解决了所有问题,不使用onBackPressed,它运行良好,并且我意识到了一些奇怪的行为

2 个答案:

答案 0 :(得分:0)

您的列表不同步。您有2个列表,一个列表为您提供传递给回收站的对象集合的引用,另一个列表位于回收站内以迭代并绘制视图持有者。

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

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

答案 1 :(得分:0)

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

  

NavigationUI.onNavDestinationSelected(menuItem,navController);

此行在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;
            }
        });

我删除了该行,一切正常,正如预期的那样,此特定方法创建了您要导航至的片段的新实例,但是问题是当您尝试导航至该片段时,您已经在,它将创建一个新实例并导航至该实例,并且该新实例位于旧实例的上方,因此当向后按下该应用程序时,它不会返回前一视图,而是返回到与旧视图相同的片段(过期,原因),我无法想象这种行为,这是很难想象的,而且不在docs中,因此我几乎死于试图理解。因此,警告:如果有人尝试使用

  

NavigationUI.onNavDestinationSelected(menuItem,navController);

请勿在同一通话中多次使用它,否则,在最佳情况下,您需要按两次:-(

相关问题