android - 图表 x 轴日期未正确显示
问题描述
我正在尝试将一些 Firestore 集合文档字段值显示为数据点。在 y 轴上我有整数值,但在 x 轴上我想显示日期。我想要日期格式为 dd/MM-HH:mm。我使用 jjoe64 android 图形库。我想在 x 轴上垂直显示每个数据点的日期。这可能吗?这是我到目前为止所做的。有什么解决办法吗?x 轴日期
这是我的片段代码:
package com.example.drodo.diamondbeacons;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;
import com.google.firebase.firestore.QuerySnapshot;
import com.jjoe64.graphview.DefaultLabelFormatter;
import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.LegendRenderer;
import com.jjoe64.graphview.Viewport;
import com.jjoe64.graphview.helper.StaticLabelsFormatter;
import com.jjoe64.graphview.series.DataPoint;
import com.jjoe64.graphview.series.LineGraphSeries;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
*/
public class TimelineFragment extends Fragment {
private FirebaseFirestore firebaseFirestore;
private FirebaseAuth firebaseAuth;
private EditText regionText;
private Button regionChooseBtn;
public SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yy-HH:mm");
public TimelineFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_timeline, container, false);
regionText = (EditText) view.findViewById(R.id.selectRegionText);
regionChooseBtn = (Button) view.findViewById(R.id.chooseRegionBtn);
GraphView graph = view.findViewById(R.id.graph);
GraphView graph2 = view.findViewById(R.id.graph2);
firebaseAuth = FirebaseAuth.getInstance();
firebaseFirestore = FirebaseFirestore.getInstance();
graph.getGridLabelRenderer().setLabelFormatter(new DefaultLabelFormatter() {
@Override
public String formatLabel(double value, boolean isValueX) {
if (isValueX) {
return simpleDateFormat.format(new Date((long) value));
}else {
return super.formatLabel(value, isValueX);
}
}
});
regionChooseBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String select_text = regionText.getText().toString();
if (!select_text.isEmpty()) {
if(firebaseAuth.getCurrentUser() != null) {
firebaseFirestore.collection("PuckData").whereEqualTo("region", select_text)
.orderBy("timestamp", Query.Direction.ASCENDING)
.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<Long> dates_list = new ArrayList<>();
List<Integer> temperature_list = new ArrayList<>();
List<Integer> light_list = new ArrayList<>();
for (DocumentSnapshot document : task.getResult()) {
int light = document.getLong("light").intValue();
int temperature = document.getLong("temperature").intValue();
long x = document.getLong("timestamp");
//String stringDate = simpleDateFormat.format(x);
temperature_list.add(temperature);
light_list.add(light);
dates_list.add(x);
}
LineGraphSeries<DataPoint> series = new LineGraphSeries<>(generateTemperatureList(dates_list, temperature_list));
series.setDrawBackground(true);
series.setAnimated(true);
series.setDrawDataPoints(true);
graph.addSeries(series);
graph.getViewport().setScalable(true); // enables horizontal zooming and scrolling
Viewport viewport = graph.getViewport();
viewport.setYAxisBoundsManual(true);
viewport.setMinY(0);
viewport.setMaxY(40);
viewport.setScrollable(true);
LineGraphSeries<DataPoint> series2 = new LineGraphSeries<>(generateLightList(dates_list, light_list));
series2.setDrawBackground(true);
series2.setColor(Color.argb(255, 135, 191, 163));
series2.setBackgroundColor(Color.argb(100, 135, 191, 163));
series2.setAnimated(true);
series2.setDrawDataPoints(true);
graph2.addSeries(series2);
graph2.getViewport().setScalable(true); // enables horizontal zooming and scrolling
Viewport viewport2 = graph2.getViewport();
viewport2.setYAxisBoundsManual(true);
viewport2.setMinY(0);
viewport2.setMaxY(100);
viewport2.setScrollable(true);
Log.d("LIST", "DATES: " + dates_list.toString());
Log.d("LIST", "TEMPS: " + temperature_list.toString());
Log.d("LIST", "LIGHTS: " + light_list.toString());
} else {
Log.d("PUCK", "Error getting documents: ", task.getException());
}
}
});
}
}
regionText.setText("");
final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
});
return view;
}
private DataPoint[] generateLightList(List<Long> dateList, List<Integer> lightList) {
DataPoint[] values = new DataPoint[dateList.size()];
for (int i = 0; i < dateList.size(); i++) {
DataPoint v = new DataPoint(Double.parseDouble(String.valueOf(dateList.get(i))), lightList.get(i));
values[i] = v;
}
return values;
}
private DataPoint[] generateTemperatureList(List<Long> dateList, List<Integer> temperatureList) {
DataPoint[] values = new DataPoint[dateList.size()];
for (int i = 0; i < dateList.size(); i++) {
DataPoint v = new DataPoint(Double.parseDouble(String.valueOf(dateList.get(i))), temperatureList.get(i));
values[i] = v;
}
return values;
}
}
解决方案
推荐阅读
- kotlin - 如何将 Kotlin 测试输出打印到控制台而不是 html 报告?
- azure - 使用 .NET SDK 从 Azure 网络接口中分离和删除 PublicIP
- loops - 循环时无法在 VHDL 中递增
- express - express 压缩中间件是否压缩请求或响应?
- javascript - 隐藏图表
- performance - Jemeter:HTTP 请求,收到成功的响应标头,但看到“错误:过滤器查询缺少键“名称”的值。” 在身体里
- react-admin - MSAL 和 React-Admin 集成
- javascript - 为什么我应该捆绑一个库(使用 Rollup 或 Webpack)插入仅使用 Babel 进行编译?
- .net - 在 ado.net 中单击 Sign with google 时发生授权错误
- javascript - 如何使用js进行性能提升