如何在xAxis条形图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);

最新更新