是否可以使用 Web 服务器 api 中的 MpAndroid 显示图表?
Is it possible to show a chart by using MpAndroid from web server api?
我是新手 android 开发人员,我有一个不同货币项目的列表,我应该打开一个包含点击项目图表的新屏幕。
当用户单击列表项时,应打开一个新屏幕,显示所选货币最近 7 天基于美元的汇率图表。每次货币数据在过去 7 天内更新时我都应该请求。
获取给定时间段内美元和加元之间的货币历史记录的示例请求:
https://api.exchangeratesapi.io/history?start_at=2019-11-27&end_at=2019-12-03&base=USD&symbols=CAD
这是我的代码:
MainActivity
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 class
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;
}
}
My emulator screen
所以当你看到这些项目时,我想显示点击项目的图表(美元和点击项目之间给定时间段内7天的货币图表)
I think that i should format the value by using XAxis
like that
xAxis.setValueFormatter(here i should use a class);
详细说明我对你的其他问题的回答并且不知道 MPAndoirdChart,在我看来,从文档中你需要制作你自己的 ValueFormatter
的 subclass 并覆盖 getFormattedValue(float)
到 return 之类的 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();
}
}
我谦虚和初步的建议是你实例化这个 class 的对象并将它传递给 xAxis.setValueFormatter()
。
链接
我是新手 android 开发人员,我有一个不同货币项目的列表,我应该打开一个包含点击项目图表的新屏幕。
当用户单击列表项时,应打开一个新屏幕,显示所选货币最近 7 天基于美元的汇率图表。每次货币数据在过去 7 天内更新时我都应该请求。
获取给定时间段内美元和加元之间的货币历史记录的示例请求:
https://api.exchangeratesapi.io/history?start_at=2019-11-27&end_at=2019-12-03&base=USD&symbols=CAD
这是我的代码:
MainActivity
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 class
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;
}
}
My emulator screen
所以当你看到这些项目时,我想显示点击项目的图表(美元和点击项目之间给定时间段内7天的货币图表)
I think that i should format the value by using
XAxis
like thatxAxis.setValueFormatter(here i should use a class);
详细说明我对你的其他问题的回答并且不知道 MPAndoirdChart,在我看来,从文档中你需要制作你自己的 ValueFormatter
的 subclass 并覆盖 getFormattedValue(float)
到 return 之类的 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();
}
}
我谦虚和初步的建议是你实例化这个 class 的对象并将它传递给 xAxis.setValueFormatter()
。