Как преобразовать данные с плавающей точкой из базы данных в данные на графике с помощью библиотеки MPAndroidChart - PullRequest
0 голосов
/ 14 апреля 2020

Я новичок в разработке android, и у меня возникла проблема с преобразованием плавающих данных из Firebase Firestore на сегодняшний день. Я хочу, чтобы эти данные отображались на графике с использованием библиотеки MPAndroidChart . Пользовательский класс имеет две переменные: weight и date . Я хочу, чтобы пользователь записал свой собственный текущий вес в редактируемый текст и после нажатия кнопки сохранил вес и текущую дату в базе данных Firebase Firestore . Затем я хочу, чтобы сохраненные данные отображались в LineChart.

Как вы можете видеть на скриншоте моей базы данных Firebase Firestore есть переменная даты в flaot. Основная проблема в том, что я понятия не имею, как я могу преобразовать эту переменную с плавающей точкой в ​​ SimpleDataFormat (дд / мм)

Это Фрагмент

public class ReportFragment extends Fragment {

    private ArrayList<Entry> weightDateList;
    private LineChart mWeightChart;
    private Button btnWeight;
    private EditText inputWeight;
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private static final String TAG = "ReportFragment";
    private Date today = new Date(System.currentTimeMillis());
    private final SimpleDateFormat mFormat = new SimpleDateFormat("dd/MM");


    public ReportFragment() {}

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_report, container, false);
        mWeightChart = view.findViewById(R.id.weight_chart);
        btnWeight = view.findViewById(R.id.add_weight);
        inputWeight = view.findViewById(R.id.input_weight);

        XAxis xWeightAxis = mWeightChart.getXAxis();
        xWeightAxis.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float dateWeight) {
                return mFormat.format(dateWeight);
            }
        });

        db.collection("WeightChartData").addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                if(e != null) {
                    Log.d(TAG, "onWeightEvent: " + e.getMessage());
                    return;
                }
                weightDateList = new ArrayList<Entry>();
                for(QueryDocumentSnapshot weightDoc : queryDocumentSnapshots) {
                    if(weightDoc.exists()) {
                        WeightDateData weightData = weightDoc.toObject(WeightDateData.class);
                        weightDateList.add(new Entry(weightData.getWeight(), weightData.getDateWeight()));
                    }
                }
            }
        });

        LineDataSet weightDataSet = new LineDataSet(weightDateList, "WeightGraph");
        LineData weightData = new LineData(weightDataSet);
        mWeightChart.setData(weightData);

        btnWeight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                saveWeight();
            }
        });
        return view;
    }

    public void saveWeight() {
        float weight = Float.valueOf(inputWeight.getText().toString());
        float dateWeight = Float.valueOf(today.getTime());
        WeightDateData weightData = new WeightDateData(weight, dateWeight);
        db.collection("WeightChartData").document().set(weightData).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Toast.makeText(getActivity(), "Input weight was success", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Надеюсь, этот пример поможет в решении этой проблемы. Спасибо всем!

1 Ответ

0 голосов
/ 15 апреля 2020

Я не пробовал этот код. Вы исправите это, если есть ошибка.

ArrayList<WeightDateData> list = new ArrayList<WeightDateData>();
XAxis xWeightAxis = mWeightChart.getXAxis();
xWeightAxis.setValueFormatter(new ValueFormatter() {
     @Override
     public String getFormattedValue(float value) {
          if(value < 0 || value > list.size() -1)
              return "";
          return mFormat.format(list.get((int)value).getDateWeight());
       }
});

int i = -1;
db.collection("WeightChartData").addSnapshotListener(new EventListener<QuerySnapshot>() {
     @Override
     public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
         if(e != null) {
              Log.d(TAG, "onWeightEvent: " + e.getMessage());
              return;
         }
         weightDateList = new ArrayList<Entry>();
         for(QueryDocumentSnapshot weightDoc : queryDocumentSnapshots) {
              if(weightDoc.exists()) {
                  WeightDateData weightData = weightDoc.toObject(WeightDateData.class);
                  list.add(weightData)
                  i++;
                  weightDateList.add(new Entry(i, weightData.getWeight()));
            }
         }
    LineDataSet weightDataSet = new LineDataSet(weightDateList, "WeightGraph");
    LineData weightData = new LineData(weightDataSet);
    mWeightChart.setData(weightData);
      }
 });
...