Как установить строковое значение даты и времени на xAxis BarChart MPAndroidChart - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь показать дату и время на оси X для своей гистограммы. Я получил эти данные из своей базы данных firebase UNIX timestamp. Я пытался преобразовать эту временную метку UNIX в удобочитаемую дату, а затем показать это на моей оси. Насколько мне известно, конструктор BarEntry не поддерживает такие типы данных, как String. Итак, я должен использовать xAxis.setValueFormatter (), чтобы показать дату. Я попытался использовать форматировщик, но это кажется неправильным, так как диаграмма перекрытия и ось X показывают неправильные результаты. Вот мой форматтер:


     public class FooFormatter extends ValueFormatter {

        private long referenceTimestamp; // minimum timestamp
        private DateFormat mDataFormat;
        private Date mDate;

        public FooFormatter(long referenceTimestamp) {
            this.referenceTimestamp = referenceTimestamp;
            this.mDataFormat = new SimpleDateFormat( "HH:mm", Locale.ENGLISH );
            this.mDate = new Date();
        }

        @Override
        public String getFormattedValue(float value) {
            // convertedTimestamp = originalTimestamp - referenceTimestamp
            long convertedTimestamp = (long) value;

            // Retrieve original timestamp
            long originalTimestamp = referenceTimestamp + convertedTimestamp;

            // Convert timestamp
            return getDateString(originalTimestamp);
        }

        private String getDateString(long timestamp) {
            try {
                mDate.setTime(timestamp * 1000);
                return mDataFormat.format(mDate);
            } catch(Exception ex) {
                return "xx";
            }
        }

    } 

это мой метод извлечения данных:


    public void retrievedata() {

        weightReference.addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                int count_test = 1;
                ArrayList<BarEntry> dataValue = new ArrayList<BarEntry>();
                if(dataSnapshot.hasChildren()){
                    for (DataSnapshot myDataSnapshot : dataSnapshot.getChildren()){

                        datapoint DataPoint = myDataSnapshot.getValue(datapoint.class);

                        originalTimestamp = DataPoint.getDate();

                        dataValue.add(new BarEntry(originalTimestamp, DataPoint.getValue()));

                        referenceTimestamp = 1587772800;
                        convertedTimestamp = originalTimestamp - referenceTimestamp;
                    }
                    showChart(dataValue);

                } else {
                    chart.clear();
                    chart.invalidate();
                }
            } 

и вот как мне использовать форматировщик xAxis:


    FooFormatter axisValueFormatter = new FooFormatter(convertedTimestamp);
        XAxis xAxis = chart.getXAxis();
        xAxis.setValueFormatter(axisValueFormatter);

ресурс: https://github.com/PhilJay/MPAndroidChart/issues/789#issuecomment -241507904

1 Ответ

0 голосов
/ 09 мая 2020

Я добавил индекс для значений x, как я сказал 0,1,3,4,5 .. Затем я создал список для дат.

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
     int count_test = 1;
     int index = 0;
     ArrayList<BarEntry> dataValue = new ArrayList<BarEntry>();
     ArrayList<Long> dateList = new ArrayList< Long >();
     if(dataSnapshot.hasChildren()){
           for (DataSnapshot myDataSnapshot : dataSnapshot.getChildren()){
               datapoint DataPoint = myDataSnapshot.getValue(datapoint.class);
               originalTimestamp = DataPoint.getDate();
               dataValue.add(new BarEntry(index, DataPoint.getValue()));
               referenceTimestamp = 1587772800;
               convertedTimestamp = originalTimestamp - referenceTimestamp;
               dateList.add(convertedTimestamp);
               index++;
           }
         showChart(dataValue, dateList);

      } else {
          chart.clear();
          chart.invalidate();
      }
  }

Я изменил форматировщик, чтобы использовать dateList :

public class FooFormatter extends ValueFormatter {

private ArrayList<Long> dateList; // minimum timestamp
private DateFormat mDataFormat;
private Date mDate;

public FooFormatter(ArrayList<Long>  dateList) {
    dateList = dateList;
    this.mDataFormat = new SimpleDateFormat( "HH:mm", Locale.ENGLISH );
    this.mDate = new Date();
}

@Override
public String getFormattedValue(float value) {
    if((int) value < 0 || (int)(value) > longArrayList.size() -1)
        return "";

    // Retrieve original timestamp
    long originalTimestamp = dateList(((int)value));

    // Convert timestamp
    return getDateString(originalTimestamp);
}

private String getDateString(long timestamp) {
    try {
        mDate.setTime(timestamp * 1000);
        return mDataFormat.format(mDate);
    } catch(Exception ex) {
        return "xx";
    }
}

}

axisValueFormatter

FooFormatter axisValueFormatter = new FooFormatter(dateList);
...