You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MPAndroidChart添加Entry后切换Activity返回数据消失的解决方法问询

Fixing MPAndroidChart Data Disappearance After Activity Switch

Hey there! I’ve dealt with this exact headache using MPAndroidChart before—nothing’s more annoying than adding data points, switching screens, and coming back to an empty chart. Let’s break down why this happens and walk through the best fixes.

Why Does This Happen?

When you switch to another Activity, your current Activity might get destroyed by the system (e.g., due to low memory) or recreated (like during a screen rotation). If you don’t save your chart’s dataset somewhere that survives this destruction, the chart will reset to its initial state when you return.

Solutions to Preserve Your Data

ViewModel is designed to hold data that survives Activity/Fragment recreation. This is the cleanest approach for most cases.

Step 1: Create a ViewModel Class

import androidx.lifecycle.ViewModel
import com.github.mikephil.charting.data.Entry

class ChartViewModel : ViewModel() {
    // Hold your chart's dataset here
    val chartEntries = mutableListOf<Entry>()
}

Step 2: Use the ViewModel in Your Activity

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import com.github.mikephil.charting.charts.LineChart
import com.github.mikephil.charting.data.LineData
import com.github.mikephil.charting.data.LineDataSet
import android.widget.Button

class ChartActivity : AppCompatActivity() {
    private lateinit var chart: LineChart
    private lateinit var viewModel: ChartViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_chart)

        chart = findViewById(R.id.lineChart)
        // Get the ViewModel instance
        viewModel = ViewModelProvider(this)[ChartViewModel::class.java]

        // Initialize chart with saved entries from ViewModel
        setupChart()

        // Example: Add a new entry when a button is clicked
        findViewById<Button>(R.id.addBtn).setOnClickListener {
            val newEntry = Entry(viewModel.chartEntries.size.toFloat(), (Math.random() * 100).toFloat())
            viewModel.chartEntries.add(newEntry)
            // Update the chart
            updateChart()
        }
    }

    private fun setupChart() {
        val dataSet = LineDataSet(viewModel.chartEntries, "User Data")
        val lineData = LineData(dataSet)
        chart.data = lineData
        chart.invalidate() // Refresh the chart
    }

    private fun updateChart() {
        chart.data?.notifyDataChanged()
        chart.notifyDataSetChanged()
        chart.invalidate()
    }
}

Now, even if your Activity is recreated, the chartEntries list in the ViewModel stays intact, so your data points won’t disappear.

2. Save Data with onSaveInstanceState (For Small Datasets)

If you only need to save a small amount of data temporarily, you can use the Activity’s onSaveInstanceState callback. Note: This isn’t ideal for large datasets, as the Bundle has size limits.

Step 1: Save the Data

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    // Convert Entries to a serializable format (e.g., list of pairs)
    val entryList = viewModel.chartEntries.map { Pair(it.x, it.y) }
    outState.putSerializable("chart_entries", ArrayList(entryList))
}

Step 2: Restore the Data

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_chart)

    viewModel = ViewModelProvider(this)[ChartViewModel::class.java]

    // Restore saved data if it exists
    savedInstanceState?.let { bundle ->
        @Suppress("UNCHECKED_CAST")
        val savedEntries = bundle.getSerializable("chart_entries") as ArrayList<Pair<Float, Float>>
        viewModel.chartEntries.addAll(savedEntries.map { Entry(it.first, it.second) })
    }

    setupChart()
}

3. Persist Data Locally (For Permanent Storage)

If you want your data to survive app restarts, use local storage options like SharedPreferences or a database (e.g., Room).

Example with SharedPreferences

import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

// Save data
private fun saveEntriesToPrefs() {
    val gson = Gson()
    val json = gson.toJson(viewModel.chartEntries)
    getSharedPreferences("ChartPrefs", MODE_PRIVATE)
        .edit()
        .putString("saved_entries", json)
        .apply()
}

// Load data
private fun loadEntriesFromPrefs() {
    val json = getSharedPreferences("ChartPrefs", MODE_PRIVATE)
        .getString("saved_entries", null)
    json?.let {
        val type = object : TypeToken<MutableList<Entry>>() {}.type
        val savedEntries = Gson().fromJson<MutableList<Entry>>(it, type)
        viewModel.chartEntries.addAll(savedEntries)
    }
}

Call saveEntriesToPrefs() when adding new data or before the Activity is destroyed, and loadEntriesFromPrefs() in onCreate() to restore data.

Which Approach Should You Use?

  • ViewModel: Best for temporary data that only needs to survive Activity recreation (e.g., during screen rotations or switching between Activities).
  • onSaveInstanceState: Good for small datasets when you don’t want to use ViewModel.
  • Local Storage: Use this if you need data to persist even after the app is closed and reopened.

内容的提问来源于stack exchange,提问作者JDoza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:26:23