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

霸气de小男生 提交于 2020-05-24 05:31:33

问题


I'm trying to show date time on X-Axis for my bar chart. I got this data from my UNIX timestamp firebase database. I have been trying to convert this UNIX timestamp to a human-readable date and then show this on my Axis. From what I know, BarEntry constructor doesn't support data type like String. So, I should use xAxis.setValueFormatter() to show the date. I have tried to use a formatter but it seems wrong like overlaps chart and the X-Axis showing incorrect results. Here is my formatter:


     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";
            }
        }

    } 

this is my method for data retrieval:


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

and this is how do I use the xAxis formatter:


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

resource: https://github.com/PhilJay/MPAndroidChart/issues/789#issuecomment-241507904


回答1:


I added an index for x values as I said 0,1,3,4,5.. Then I created a list for the dates.

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

I changed the formatter to use the 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);


来源:https://stackoverflow.com/questions/61667774/how-to-set-string-value-of-date-time-on-xaxis-barchart-mpandroidchart

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!