如何在 xAxis BarChart MPAndroidChart 上设置日期时间的字符串值

How to set String value of date time on xAxis BarChart MPAndroidChart

我试图在我的条形图的 X 轴上显示日期时间。我从我的 UNIX 时间戳 firebase 数据库中获取了这些数据。我一直在尝试将此 UNIX 时间戳转换为人类可读的日期,然后在我的 Axis 上显示它。据我所知,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

我为 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();
      }
  }

我更改了格式化程序以使用日期列表:

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);