【问题标题】:How to retrieve JSON data and plot a LineChart using MPAndroidChart and retrofit on android如何使用 MPAndroidChart 检索 JSON 数据并绘制 LineChart 并在 android 上进行改造
【发布时间】:2021-04-26 11:06:59
【问题描述】:

我正在尝试使用改造检索数据并使用 MPAndroidChart 放置它们。我可以从 JSON 中检索数据,还可以在线图上手动添加定义的 x、y(例如 x=1、y=1)。

但是,我仍在学习 MPLineChart 和(尤其是 LineChart),并且对结合这两个概念感到震惊 - 检索 y1 和 y2 数据并使用这些数据随时间绘制折线图。谁能让我了解一下如何检索 JSON 数据和绘图?

这是我目前所拥有的:

主活动:

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;

public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            drawLineChart();
        }

        private void drawLineChart() {
            LineChart lineChart = findViewById(R.id.chart);
            List<Entry> lineEntries = getDataSet();
            LineDataSet lineDataSet = new LineDataSet(lineEntries, getString(R.string.data1));
            lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
            lineDataSet.setHighlightEnabled(true);
            lineDataSet.setLineWidth(2);
            lineDataSet.setColor(Color.RED);
            lineDataSet.setCircleColor(Color.YELLOW);
            lineDataSet.setCircleRadius(6);
            lineDataSet.setCircleHoleRadius(3);
            lineDataSet.setDrawHighlightIndicators(true);
            lineDataSet.setHighLightColor(Color.RED);
            lineDataSet.setValueTextSize(12);
            lineDataSet.setValueTextColor(Color.DKGRAY);

            LineData lineData = new LineData(lineDataSet);
            lineChart.getDescription().setTextSize(12);
            lineChart.setDrawMarkers(true);
            lineChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTH_SIDED);
            lineChart.animateY(1000);
            lineChart.getXAxis().setGranularityEnabled(true);
            lineChart.getXAxis().setGranularity(1.0f);
            lineChart.getXAxis().setLabelCount(lineDataSet.getEntryCount());
            lineChart.setData(lineData);
        }

        private List<Entry> getDataSet() {
            List<Entry> lineEntries = new ArrayList<Entry>();
            //lineEntries.add(new Entry(0, 1));
            //lineEntries.add(new Entry(1, 2));
            //lineEntries.add(new Entry(2, 3));
            //lineEntries.add(new Entry(3, 4));
            return lineEntries;
        }

    private void fetchData() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Api.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        Api api = retrofit.create(Api.class);
        Call<List<Details>> call = api.getstatus();
        call.enqueue(new Callback<List<Details>>() {
            @Override
            public void onResponse(Call<List<Details>> call, Response<List<Details>> response) {
                List<Details> adslist = response.body();

            }
            @Override
            public void onFailure(Call<List<Details>> call, Throwable t) {
                Toast.makeText(MainActivity.this, ""+t.getMessage().toString(), Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    }

对于 gson:

public class Details {
    @SerializedName("y1")
    @Expose
    private String y1;
    @SerializedName("y2")
    @Expose
    private String y2;
    @SerializedName("timestamps")
    @Expose
    private String timestamps;

    public String getY1() {
        return y1;
    }

    public void setY1(String y1) {
        y1 = y1;
    }

    public String getY2() {
        return y2;
    }

    public void setY2(String y2) {
        y2 = y2;
    }

    public String getTimestamps() {
        return timestamps;
    }

    public void setTimestamps(String timestamps) {
        timestamps = timestamps;
    }
}

对于 API:

public interface Api {
    String BASE_URL = "http://..";
    @GET("Api.php")
    Call<List<Details>> getstatus();
}

而数据是:

[{"y1":"40","y2":"80","timestamps":"2020-1-10 18:00:34"},{"y1":"50","y2":"60","timestamps":"2020-1-10 17:40:20"},{"y1":"70","y2":"30","timestamps":"2020-1-10 17:20:34"}]

【问题讨论】:

  • 您的响应中是否仅获得 y 坐标值,或者这是 (x,y) 值?
  • 非常感谢您的回复!我的意思是只得到两个 y 值并绘制与时间的关系图!如果您对 x 轴也有时间建议?我要试一试,然后回复你!谢谢!

标签: java android json retrofit mpandroidchart


【解决方案1】:

像这样更改您的 getDataSet 方法

private void getDataSet(List<Details> list) {
        List<Entry> lineEntries = new ArrayList<Entry>();
        if(list!=null){

         for(Details details : list){

           lineEntries.add(new Entry(Float.parseFloar(details.getY1()),Float.parseFloat(details.getY2()));

           }
        }
        

LineDataSet lineDataSet = new LineDataSet(lineEntries, getString(R.string.data1));
            lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
            lineDataSet.setHighlightEnabled(true);
            lineDataSet.setLineWidth(2);
            lineDataSet.setColor(Color.RED);
            lineDataSet.setCircleColor(Color.YELLOW);
            lineDataSet.setCircleRadius(6);
            lineDataSet.setCircleHoleRadius(3);
            lineDataSet.setDrawHighlightIndicators(true);
            lineDataSet.setHighLightColor(Color.RED);
            lineDataSet.setValueTextSize(12);
            lineDataSet.setValueTextColor(Color.DKGRAY);

            LineData lineData = new LineData(lineDataSet);
            lineChart.getDescription().setTextSize(12);
            lineChart.setDrawMarkers(true);
            lineChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTH_SIDED);
            lineChart.animateY(1000);
            lineChart.getXAxis().setGranularityEnabled(true);
            lineChart.getXAxis().setGranularity(1.0f);
            lineChart.getXAxis().setLabelCount(lineDataSet.getEntryCount());
            lineChart.setData(lineData);


    }

然后
decalre your line in oncreate method <br>
LineChart lineChart = findViewById(R.id.chart);<br>

并从 fetchData onResposne() 方法调用这个 getDataSet(List list) 方法

【讨论】:

  • 目前有两个错误。 y1 和 y2 值似乎是来自 JSON 的字符串;这条线lineEntries.add(new Entry(details.getY1(),details.getY2()); 说它希望有浮动。有没有办法解决这个问题,或者我应该查看数据库的更改?
  • 二:return lineEntriesCannot return a value from a method with void result type
  • 非常感谢您的回复。只是无法调用 getDataSet..error: method getDataSet in class MainActivity cannot be applied to given types; List&lt;Entry&gt; lineEntries = getDataSet(); ^ required: List&lt;Details&gt; found: no arguments reason: actual and formal argument lists differ in length
猜你喜欢
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2021-07-14
相关资源
最近更新 更多