这是Android Studio中的新功能,我想制作一个带有图表的应用程序,该图表将根据从数据库中检索到的数据实时更新。其主旨是将一些坐标存储到数据库中,并根据数据库的内容更新图表。到目前为止,我根据从this tutorial中学到的知识,并在MPAndroidChart Wiki,教程和示例代码中制作了一个。我将集成两者的唯一方法做的就是放弃适配器(因为我不知道它在MPAndroidChart中的作用)和RecyclerView,因为它是一张图表。它可以工作,但是有一些我似乎无法解决的错误。
1。)第一次运行时,没关系,添加Coordinates(我用于存储在数据库中的对象)会立即更新图表。但是,当我再次运行该应用程序并存储了之前的数据时,该图表将不会立即更新,并且基本上冻结了该图表,直到输入了大约10个条目为止。有时它毕竟不会更新。
2。)有时第一个点上出现一条伪影线(因此,在生成的点之间有一条线,然后其他那条线就没了,像这样)它仅在第二次运行时发生,依此类推
关于我哪里出了问题的任何想法?我认为这是适配器的一部分;但是我不知道如何用MPAndroidChart来制作..:/
编辑:这是我的一些代码。大部分内容与Room教程中的内容几乎相同,但是使用的是Coordinates对象。
这是MainActivity.java中onChanged的作用:
mCoordinatesViewModel.getAllCoordinates().observe(this, new Observer<List<Coordinates>> () {
@Override
public void onChanged(@Nullable final List<Coordinates> coordinates){
if (coordinates != null && !coordinates.isEmpty()) { updateChart(coordinates); }
}
});
updateChart函数:
private void updateChart(List<Coordinates> coordinates){
TextView displayViewNum = (TextView) textViewNum;
LineData data = chartMain.getData();
ILineDataSet set = data.getDataSetByIndex(0);
if (set == null){
set = createSet();
data.addDataSet(set);
}
if (firstEntry) {
set.removeFirst();
firstEntry = false;
}
// retrieve from database
int dx = (int) coordinates.get(coordinates.size() - 1).getX();
float dy = (float) coordinates.get(coordinates.size() - 1).getY();
String text = "(" + dx + ", " + dy + ")";
displayViewNum.setText(text);
// add to data as Entry
Entry entry = new Entry(dx, dy);
data.addEntry(entry, 0);
data.notifyDataChanged();
chartMain.notifyDataSetChanged();
chartMain.setVisibleXRangeMaximum(10);
chartMain.moveViewToX(data.getEntryCount());
}
我不知道要发布很长的时间才能发布什么代码。因此,如果有任何答复,我将一路进行编辑。
谢谢!
编辑:解决了核心问题,因为该应用无法从数据库中加载以前的数据。我试着做这个功能:
private void initializeChart(List<Coordinates> coordinates){
LineData data = chartMain.getData();
ILineDataSet set = data.getDataSetByIndex(0);
if (set == null){
set = createSet();
data.addDataSet(set);
}
if (firstEntry) {
set.removeFirst();
firstEntry = false;
}
// retrieve from database
for (int i = 0; i < coordinates.size(); i++) {
int dx = (int) coordinates.get(i).getX();
float dy = (float) coordinates.get(i).getY();
// add to data as Entry
Entry entry = new Entry(dx, dy);
data.addEntry(entry, 0);
data.notifyDataChanged();
chartMain.notifyDataSetChanged();
chartMain.setVisibleXRangeMaximum(10);
chartMain.moveViewToX(data.getEntryCount());
}
}
并在onCreate函数上这样调用它:
initializeChart(mCoordinatesViewModel.getAllCoordinates().getValue());
但是现在它仍然崩溃。启动时是否有办法从Room数据库中获取以前的数据(如果有)?我想我可以从那里更新图表。
这是logcat产生的东西;红色文字改为斜体:
07-08 10:44:07.660 246-246/? I/auditd: type=1403 audit(0.0:2): policy loaded auid=4294967295 ses=4294967295
07-08 10:44:07.660 246-246/? W/auditd: type=1404 audit(0.0:3): enforcing=1 old_enforcing=0 auid=4294967295 ses=4294967295
07-08 10:44:08.180 1-1/? W/init: type=1400 audit(0.0:4): avc: denied { create } for name="preload" scontext=u:r:init:s0 tcontext=u:object_r:system_file:s0 tclass=dir permissive=0
type=1400 audit(0.0:5): avc: denied { create } for name="preload" scontext=u:r:init:s0 tcontext=u:object_r:system_file:s0 tclass=dir permissive=0
07-08 10:44:08.950 1-1/? W/init: type=1400 audit(0.0:6): avc: denied { create } for name="root_channel" scontext=u:r:init:s0 tcontext=u:object_r:root_execute_file:s0 tclass=dir permissive=0
07-08 10:44:09.090 248-248/? I//system/bin/tzdatacheck: tzdata file /data/misc/zoneinfo/current/tzdata does not exist. No action required.
--------- beginning of system
--------- beginning of system