Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
Android 保留旧信息的片段(未正确更新)_Android_Android Studio_Android Fragments_Kotlin - Fatal编程技术网

Android 保留旧信息的片段(未正确更新)

Android 保留旧信息的片段(未正确更新),android,android-studio,android-fragments,kotlin,Android,Android Studio,Android Fragments,Kotlin,我正在Kotlin中开发一个应用程序,当涉及到我的一个名为ChartsFragment的特定片段时,我遇到了一些问题。基本上,当单击导航抽屉项时,我将从数据库查询数据,并将其传递给名为ChartsFragment的片段以显示。我用它在碎片上绘制我的数据。现在,一切正常,只是出于某种原因,我必须单击导航图标两次,以便片段加载更新的数据。单击导航图标一次时,它不会更新数据 以下是用于存储数据库查询数据的全局变量: private var completed = mutableListOf<St

我正在
Kotlin
中开发一个应用程序,当涉及到我的一个名为
ChartsFragment
的特定片段时,我遇到了一些问题。基本上,当单击导航抽屉项时,我将从数据库查询数据,并将其传递给名为
ChartsFragment
的片段以显示。我用它在碎片上绘制我的数据。现在,一切正常,只是出于某种原因,我必须单击导航图标两次,以便片段加载更新的数据。单击导航图标一次时,它不会更新数据

以下是用于存储数据库查询数据的全局变量:

private var completed = mutableListOf<String>()
以下是单击导航抽屉图标
Charts
时的代码:

        R.id.nav_chart -> {
            val currentUser = mAuth!!.currentUser
            if (currentUser != null) {
                getProgress()

                var basics = 0
                var loops = 0
                var functions = 0

                completed.forEach {
                    if (it == "Data Type" || it == "Operation" || it == "Condition" || it == "Null Safety") {
                        basics++
                    } else if (it == "For" || it == "Break" || it == "Repeat" || it == "When" || it == "While") {
                        loops++
                    } else if (it == "Call" || it == "Main" || it == "Recursion" || it == "Single Expression") {
                        functions++
                    }
                }
                completed.clear()

                val bundle = Bundle()
                bundle.putDouble("basics",basics.toDouble())
                bundle.putDouble("loops",loops.toDouble())
                bundle.putDouble("functions",functions.toDouble())
                chartFragment(bundle)

            } else {
                Toast.makeText(applicationContext, R.string.sign_in_to_track, Toast.LENGTH_SHORT).show()
            }
        }
以下是加载片段时的代码:

/**
 * For loading fragments
 */

fun chartFragment(bundle: Bundle){
    this.setTitle(R.string.navigation_drawer_chart)
    val fragmentManager = supportFragmentManager
    val transaction = fragmentManager.beginTransaction()
    val fragment = ChartFragment()
    fragment.setArguments(bundle)
    transaction.replace(R.id.frameLayout1, fragment)
    transaction.commit()
}
这是我的片段的
onCreateView

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {

    val view = inflater.inflate(R.layout.fragment_chart, container, false)
    val graph = view?.findViewById(R.id.graph) as GraphView
    val basics = arguments!!.getDouble("basics")
    val loops = arguments!!.getDouble("loops")
    val functions  = arguments!!.getDouble("functions")
    val series = LineGraphSeries(arrayOf(
            DataPoint(0.0, 0.0),
            DataPoint(1.0, basics),
            DataPoint(2.0, loops),
            DataPoint(3.0, functions),
            DataPoint(4.0, 0.0)
    ))

    series.setColor(Color.GREEN)
    series.setDrawDataPoints(true)
    series.setAnimated(true)

    graph.addSeries(series)

    return view
}
我在想这是缓存问题吗?是否有一种方法可以强制单击导航抽屉的项目作为临时解决方案

更新:我认为may
AsyncTasks
可以解决这个问题,但我不知道如何实现
AsyncTasks
任务。似乎最可能的原因是
getProgress()
可能太慢,程序正在执行下一行,而不是等待
getProgress()
完成

更新:在第一次单击后,我得到的
已完成的
的大小始终是上一次单击的大小(不是来自数据库的更新数据),在第二次单击时,我将得到当前大小(当前来自数据库)。因此,如果我的数据库有0个项目,在第一次单击时,我会得到0,这是正确的,然后如果我在应用程序中完成了一项活动,那么数据库将更新为1个项目。所以,如果我现在点击图表图标,我应该得到尺寸1,但我得到尺寸0。第二次点击,我会得到1号

更新:因此,如果我在应用程序中完成另一个活动,我的数据库现在应该有2个项目。因此,如果我再次单击图表图标,我应该得到2号,但我不会仍然停留在以前的1号。我第二次点击这个,我会得到2号的

似乎最可能的原因是getProgress()可能太慢,程序正在执行下一行,而不是等待getProgress()完成

是的,在更新完成之前,程序正在执行
getProgress()
之后的下一行。但事实上,
getProgress()
已经完成。它的工作只是触发数据库调用。调用本身是异步执行的(即在另一个线程上)。只要执行
onDataChange()
,主线程就可以访问结果。这只能在当前运行的功能(处理图标单击的功能)完成后发生


因为您的逻辑取决于数据库调用的结果,所以应该将计算新数据的行移动到
onDataChange()中

请在
完成之前检查
完成的
的大小。forEach
循环-第一次单击后得到的大小是多少?@0X0nosugar I在帖子中更新了大小的详细信息
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {

    val view = inflater.inflate(R.layout.fragment_chart, container, false)
    val graph = view?.findViewById(R.id.graph) as GraphView
    val basics = arguments!!.getDouble("basics")
    val loops = arguments!!.getDouble("loops")
    val functions  = arguments!!.getDouble("functions")
    val series = LineGraphSeries(arrayOf(
            DataPoint(0.0, 0.0),
            DataPoint(1.0, basics),
            DataPoint(2.0, loops),
            DataPoint(3.0, functions),
            DataPoint(4.0, 0.0)
    ))

    series.setColor(Color.GREEN)
    series.setDrawDataPoints(true)
    series.setAnimated(true)

    graph.addSeries(series)

    return view
}