【问题标题】:Fragment refresh by attach() and detach() to reload data from db通过 attach() 和 detach() 刷新片段以从 db 重新加载数据
【发布时间】:2019-12-28 16:25:06
【问题描述】:

在我的 android 应用程序中,我将数据从数据库加载到片段内的 ListView 中。如果查询从数据库返回空,则会显示一个文本视图,显示“Nothing to Display”,但如果接收到数据,它会显示“项目列表”,下面是一个带有检索数据的 ListView。一切正常,但问题是当我使用空数据库启动应用程序时,它显示文本视图“Nothing to Display”但是当我在应用程序运行时将数据插入数据库时​​,转到另一个片段并返回它显示“列表项目”,下面的 Listview 中没有项目,我需要重新启动应用程序才能让数据显示在 ListView 中。

我查找了解决方案,他们说可以通过附加和分离片段来刷新/重新加载片段来修复它。

FragmentManager manager = getSupportFragmentManager();

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        switch (menuItem.getItemId()){
            case R.id.js_nav_home:
                manager.beginTransaction().replace(R.id.js_fragment_container, new js_HomeFragment()).commit();
                break;
            case R.id.js_nav_profile:
                manager.beginTransaction().replace(R.id.js_fragment_container, profileFragment)
                        .commit();
                break;
            case R.id.js_nav_find:
                manager.beginTransaction().replace(R.id.js_fragment_container, new js_MatchFragment())
                        .commit();
                break;
            case R.id.js_nav_logout:
                finish();
                break;
        }

        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

我试过了

manager.beginTransaction().detach().attach(this).
                        replace(R.id.js_fragment_container, new js_HomeFragment()).commit();

但我不知道要在“detach()”函数中放入什么参数。或者如果这是分离和连接的正确方法。

谢谢!对不起我的英语不好。

【问题讨论】:

标签: android android-fragments fragmentmanager


【解决方案1】:

我想你是在 Fragment 的 onCreate 方法中获取数据,但是视图总是在你选择你的 Fragment 时重新创建,调用 onCreateView 方法但永远不会再次获取数据......所以你需要获取它们当数据库更新时...

快速的解决方案总是在 onViewCreated 方法中获取数据,但这不是一个好主意,因为如果数据没有更新,则不需要获取它们。

因此,最佳解决方案取决于您的架构,例如,如果您使用共享 ViewModel,您可以在保存数据时更新 LiveData,并且在 Fragment 重新创建视图时填充最后的 LiveData 值。

另一种方法是使用广播接收器,但也不是一个好的解决方案......

对您的架构使用最佳方式,有必要了解 Fragment 的生命周期并小心使用 LiveData,因为它们始终是同一个实例。

【讨论】:

    【解决方案2】:

    这似乎对我有用:

    getSupportFragmentManager()
                    .beginTransaction()
                    .detach(this)
                    .attach(this)
                    .commit();
    

    再次调用onCreateView 方法并重绘视图层次结构。

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 2014-12-18
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多