有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java MpAndroidChart。柱状图到云

您好,我想要一个建议,我如何在云中保存条形图(MPChartAndroid library)数据?我使用Gson将其转换为Json,然后将ArrayList写入FireBase和Shared Preference。这是正确的方法吗

问题是:当我加载数据时,前两个条目被设置为0 例如:我有一张从2016年7月1日到2018年7月1日的每日柱状图。 我在2017年6月28日至2017年7月1日注册数据,但在2017年7月2日的第二天,我在应用程序中输入数据,28.06和29.06的输入设置为0

此外,我希望如果用户当前日期高于ArrayList中的最后一个日期,则添加新的日期集,但保留带有数据项的旧日期集

以下是ArrayList的声明

private ArrayList<BarEntry> barEntryArrayList = new ArrayList<>();
private ArrayList<String> datelist = new ArrayList<>();

从共享pref中检索数据

 SharedPreferences sharedPreferences = getSharedPreferences("SharedPrefs", 0);
    SharedPreferences sharedChronoPrefs = getSharedPreferences("ChronometerSample", MODE_PRIVATE);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    Type type2 = new TypeToken<ArrayList<BarEntry>>() {}.getType();

    String jsonResp = sharedPreferences.getString("jsonString", null);
    if (jsonResp != null) {
        datelist = gson.fromJson(jsonResp, type);
    }
    Log.d(TAG, "loadDataList() called");

    String json = sharedPreferences.getString("json", null);
    if (json != null) {
        barEntryArrayList = gson.fromJson(json, type2);
    }

设置图表

addPreviousData();
    addNewEntry();
    BarDataSet barDataSet = new BarDataSet(barEntryArrayList, "# of Questions Answered");


    LocalDate todayD = new LocalDate();
    String tdy = todayD.toString();

    BarData barData = new BarData(datelist, barDataSet);
    int posX = datelist.indexOf(tdy);
    currentPos = barData.getXValCount() - posX;

    mChart.setScaleMinima((float) barData.getXValCount() / 5f, 1f);
    mChart.zoom(-10f, 0f, 0, 0);
    mChart.moveViewToX(barData.getXValCount() - currentPos - 3);
    mChart.invalidate();
    barDataSet.setValueTextColor(Color.GREEN);
    barDataSet.setValueTextSize(14f);
    barDataSet.setColor(Color.GREEN);
    mChart.setData(barData);
    mChart.notifyDataSetChanged();
    mChart.animateXY(2000, 1000);
    YAxis leftAxis = mChart.getAxisLeft();
    leftAxis.setTextColor(Color.WHITE);
    leftAxis.setAxisMinValue(0f);
    leftAxis.setAxisMaxValue(100f);

将日期添加到ArrayList日期列表

   private void addPreviousData() {

    if (datelist == null || datelist.size() <= 0) {
        LocalDate endDate = new LocalDate();
        endDate = endDate.plusYears(1);
        LocalDate starDate = endDate.minusYears(2);

        List<LocalDate> totalDates = new ArrayList<>();
        while (!starDate.isAfter(endDate)) {
            totalDates.add(starDate);
            starDate = starDate.plusDays(1);
        }
        for (int i = 0; i < totalDates.size(); i++) {
            datelist.add(totalDates.get(i).toString());
        }
        Log.d(TAG, "addPreviousData() called" + totalDates.size());
        Log.d(TAG, "addPreviousData  :" + datelist.size());
    }
}

向图表中添加条目

 private void addNewEntry() {

    if (barEntryArrayList == null || barEntryArrayList.size() <= 0) {
        for (int i = 0; i < datelist.size(); i++) {
            barEntryArrayList.add(new BarEntry(0f, i));
        }
        mChart.notifyDataSetChanged();
        mChart.invalidate();
        Log.d(TAG, "addNewEntry() returned: " + barEntryArrayList.size());
    }
}

更新当前日期位置:

   // int posX = datelist.indexOf(tdy);
   // currentPos = barData.getXValCount() - posX;
 private void updateEntry(float updateValue) {
    int updatePos = datelist.size() - currentPos;
    if (isNewDay()) {
        updatePos++;
    }
    BarEntry barEntry = barEntryArrayList.get(updatePos);
    Log.d(TAG, "updateEntry() returned: position " + datelist.get(datelist.size() - currentPos));
    barEntry.setVal(updateValue);
    mChart.notifyDataSetChanged();
    mChart.invalidate();
}

保存数据

private void saveDataList() {

    Gson gson = new Gson();
    SharedPreferences sharedPreferences = getSharedPreferences("SharedPrefs", 0);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    String jsonString = gson.toJson(datelist);
    String json = gson.toJson(barEntryArrayList);
    editor.putString("jsonString", jsonString).apply();
    editor.putString("json", json).apply();
     LocalDate tomorrow = new LocalDate().plusDays(1);
    editor.putString("LocalTime", tomorrow.toString());
  }

看看这是不是新的一天

  private boolean isNewDay() {

    SharedPreferences sharedPreferences = getSharedPreferences("SharedPrefs", 0);
    boolean isNewDay;
    LocalDate todayDate = new LocalDate();

    String tomorrow = sharedPreferences.getString("LocalTime", todayDate.plusDays(1).toString());
    Log.d(TAG, "checkDates: sharedpRefs Tomorrow : " + sharedPreferences.getString("LocalTime", null));
    String today = todayDate.toString();

    if (today.equals(tomorrow)) {
        tomorrow = todayDate.plusDays(1).toString();
        isNewDay = true;
        Log.d(TAG, "checkDates: Tomorow at End  if/else  :value : " + isNewDay + " " + tomorrow);
    } else {
        isNewDay = false;
        Log.d(TAG, "checkDates: Tomorow at End  if/else  :value : " + isNewDay + " " + tomorrow);
    }
    return isNewDay;
}

和onCreate()

  if (isNewDay() || isFirstRun) {
        dailyQuestion = 0;

    }

共 (1) 个答案

  1. # 1 楼答案

    使用Gson库,我将BarEntry的ArrayList转换为JSON字符串,并将值保存在Firese中,然后在检索时简单地转换为BarEntry列表。计算项目在ArrayList中的位置,并根据MPAndroidChart库的文档更新值