【问题标题】:Is it possible to show a chart by using MpAndroid from web server api?是否可以使用来自 Web 服务器 api 的 MpAndroid 显示图表?
【发布时间】:2019-12-12 14:24:14
【问题描述】:

我是新手 android 开发人员,我有一个不同货币项目的列表,我应该打开一个带有点击项目图表的新屏幕。

当用户单击列表项时,应打开一个新屏幕,显示过去 7 天所选货币基于美元的汇率图表。我应该在过去 7 天内每次更新货币数据时请求。

获取给定时间段内美元和加元之间的货币历史记录的示例请求:

https://api.exchangeratesapi.io/history?start_at=2019-11-27&end_at=2019-12-03&base=USD&symbols=CAD

这是我的代码:

主活动

 public class MainActivity extends AppCompatActivity {
        private ProgressBar progressBar;


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

            progressBar = findViewById(R.id.progress_bar);
            new GetServerData(this).execute();

        }

        private static class GetServerData extends AsyncTask<Integer, Void, List<CurrencyRate>> {
            private static final int TIMEOUT = 30000;
            private static final String BASE_URL = "https://api.exchangeratesapi.io/latest?base=USD";
            private WeakReference<MainActivity> activityReference;

            GetServerData(MainActivity context) {
                activityReference = new WeakReference<>(context);
            }

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                MainActivity activity = activityReference.get();
                if (activity == null || activity.isFinishing()) {
                    return;
                }
                activity.progressBar.setVisibility(View.VISIBLE);
            }

            @Override
            protected List<CurrencyRate> doInBackground(Integer... integers) {
                List<CurrencyRate> currencyList = new ArrayList<>();
                OkHttpClient client = new OkHttpClient().newBuilder()
                        .readTimeout(TIMEOUT, TimeUnit.SECONDS)
                        .connectTimeout(TIMEOUT, TimeUnit.SECONDS)
                        .writeTimeout(TIMEOUT, TimeUnit.SECONDS)
                        .retryOnConnectionFailure(true)
                        .build();
                Request request = new Request.Builder()
                        .url(BASE_URL)
                        .build();
                try {
                    Response response = client.newCall(request).execute();
                    Log.d("Response", response.toString());
                    long tx = response.sentRequestAtMillis();
                    long rx = response.receivedResponseAtMillis();
                    System.out.println("response time : " + (rx - tx) + " ms");
                    JSONObject object = new JSONObject(Objects.requireNonNull(response.body()).string());
                    JSONObject rates = object.getJSONObject("rates");
                    Iterator<String> iterator = rates.keys();
                    while (iterator.hasNext()) {
                        String key = iterator.next();
                        String value = rates.getString(key);
                        CurrencyRate data = new CurrencyRate(key, value);
                        currencyList.add(data);
                    }
                } catch (IOException | JSONException e) {
                    e.printStackTrace();
                    Log.d("MainActivity", e.toString());
                }
                return currencyList;
            }

            @Override
            protected void onPostExecute(final List<CurrencyRate> result) {
                final MainActivity activity = activityReference.get();
                if (activity == null || activity.isFinishing()) {
                    return;
                }
                ListView listView = activity.findViewById(R.id.list_view);
                CurrencyAdapter adapter = new CurrencyAdapter(activity, result);
                listView.setAdapter(adapter);
                listView.smoothScrollToPosition(0);
                adapter.notifyDataSetChanged();
                activity.progressBar.setVisibility(View.GONE);
                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                        Toast.makeText(activity.getApplicationContext(), result.get(i).getName()+" Clicked", Toast.LENGTH_SHORT).show();
                        /*Which code should be here to open a new screen with exchange chart for last 7 days of clicked item??*/
                    }
                });
            }
        }

    }

CurrencyRate 类

public class CurrencyRate {
    private String name;
    private String value;

    public CurrencyRate(String name, String value) {
        super();
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

我的模拟器屏幕

所以当您看到这些项目时,我想显示点击项目的图表(美元和点击项目之间的给定期间 7 天的货币图表)

【问题讨论】:

  • 你的问题不是很宽泛吗?你的搜索在哪里?你的尝试,你的研究?不懂Android编程的问(只擅长Java)。
  • @OleV.V.我在 Github 有自己的新闻应用程序,你可以看看我是否只擅长 JAVA :) Github Link.
  • @OleV.V.我已经解决了这个问题,但是你告诉我的关于LocaleDate 我仍然无法将它转换为long 值我做了一个长数组。 LocalDate date1 = LocalDate.parse(keyDate); int []date = new int[]{date1.getYear(),date1.getMonthValue(),date1.getDayOfMonth()}; StringBuilder builder = new StringBuilder(); for (int i :date) { builder.append(i); } long v = Long.parseLong(builder.toString()); 结果是20191127!!!我如何在没有String 的情况下将此数字转换为 2019-11-27。
  • @OleV.V.我认为我应该使用XAxis 来格式化值,就像xAxis.setValueFormatter(here i should use a class); 我应该找到类似于这个问题Stackoverflow

标签: java android android-intent retrofit mpandroidchart


【解决方案1】:

我认为我应该像这样使用XAxis 来格式化值 xAxis.setValueFormatter(here i should use a class);

详细说明我对您的其他问题的回答并且不知道 MPAndoirdChart,在我看来,您需要创建自己的 ValueFormatter 子类并覆盖 getFormattedValue(float) 以返回类似 LocalDate.ofEpochDay(Math.round(value)).toString() 的内容。您可能想要使用DateTimeFormatter,而不是toString

这是一个快速尝试,未经测试:

public class DateValueFormatter extends ValueFormatter {

    @Override
    String getFormattedValue(float value) {
        int epochDay = Math.round(value);
        LocalDate date = LocalDate.ofEpochDay(epochDay);
        return date.toString();
    }

}

我谦虚而初步的建议是你实例化这个类的一个对象并将它传递给xAxis.setValueFormatter()

链接

【讨论】:

  • 非常感谢您的帮助,这是个好主意,但是在这一行中,value 我应该通过Date in String or in floatbarEntries.add(new BarEntry(here i mean, Float.parseFloat(value)));
  • 我相信您可以将我的第一个答案中的epochDayLong 传递给BarEntry 构造函数。 Java 会自动从long 转换为float。这个想法是,自纪元以来的天数将是图表在 x 轴上使用的单位。我仍然建议您忘记所有关于设计不佳且早已过时的Date 类。
  • 谢谢!终于我得到了正确的日期,你太棒了:)
  • 我怎样才能成为一名成功的 Android 开发者你能给我一些建议吗?
  • 您可以在 Internet 上找到的信息和建议比我在这里想象的要好得多。最后,适用于一个人的路径可能不适用于其他人,因此您需要找到自己的变体。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2012-10-06
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多