大佬教程收集整理的这篇文章主要介绍了Android——一个简单的记账本APP,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
日期选择采用CalendarView
控件c;时间选择采用TimePicker
控件c;然后通过switch
控件控制其VISIBLE
和GONE
属性c;类型通过PopUpWindows弹窗显示c;标签通过SharedPreferences
进行传递。最后插入sqlite数据库中。
因为获取的日历控件的月份要比实际少一个月c;故因此需要把月份加上一。 然后将获取的年月日字符串数据转为Date格式c;最后将Date格式转为当时的星期
public static Date getStringToDate(String str){
mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
try {
Date date = mSimpleDateFormat.parse(str);
return date;
} catch (ParseException E) {
e.printStackTrace();
}
return null;
}
public static String getWeekOfDate(Date datE) {
String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar cal = Calendar.geTinstance();
cal.setTime(datE);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}
最后将获取的日期、星期进行保存
/**
* 显示选择的年月日c;并将选择的年月日转为星期
*/
private void getDate() {
mCalendarView.setOnDateChangeListener(new CalendarView.onDateChangeListener() {
@Override
public void onSELEctedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) {
month = month + 1;
CNDate = year + "年" + month + "月" + dayOfMonth + "日";
String date = year + "-" + month + "-" + dayOfMonth;
Log.d(tag, "date=" + datE);
Log.d(tag, "CNdate=" + CNDatE);
//String日期转date日期c;在转为星期
String week = DateUtils.getWeekOfDate(DateUtils.getStringToDate(datE));
Log.d(tag, "week=" + week);
SELEctDate.setText(CNDate + " " + week);
}
});
}
直接对TimePicker
控件进行事件监听c;然后将获取的时间进行保存即可
private void getTime() {
mTimePicker.setOnTimeChangedListener(new TimePicker.onTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minutE) {
String time = hourOfDay + ":" + minute;
SELEctTime.setText(timE);
Log.d(tag, timE);
}
});
}
建立thumb.xml和track.xml两个选择器 thumb.xml如下
<SELEctor xmlns:android="http://scheR_78_11845@as.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/open_thumb"/>
<item android:drawable="@drawable/shut_thumb"/>
</SELEctor>
track.xml如下
<SELEctor xmlns:android="http://scheR_78_11845@as.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/open_track"/>
<item android:drawable="@drawable/shut_track"/>
</SELEctor>
然后分别建立两个选择器的不同状态下的效果文件 open_thumb.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://scheR_78_11845@as.android.com/apk/res/android"
android:shape="rectangle" >
<!-- 高度40 -->
<size android:height="30dp" android:width="30dp"/>
<!-- 圆角弧度 20 -->
<corners android:radius="15dp"/>
<!-- 变化率 -->
<gradient
android:endColor="#eeeeee"
android:startColor="#eeeeee" />
<!--<stroke android:width="1dp"-->
<!-- android:color="#2196F3"/>-->
</shape>
shut_thumb.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://scheR_78_11845@as.android.com/apk/res/android"
android:shape="rectangle" >
<size android:height="30dp" android:width="30dp"/>
<!-- 圆角弧度 20 -->
<corners android:radius="15dp"/>
<!-- 变化率 -->
<gradient
android:endColor="#eeeeee"
android:startColor="#eeeeee" />
<stroke android:width="1dp"
android:color="#A8A7A7"/>
</shape>
open_track.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://scheR_78_11845@as.android.com/apk/res/android"
android:shape="rectangle">
<!-- 高度30 此处设置宽度无效-->
<size android:height="30dp"/>
<!-- 圆角弧度 15 -->
<corners android:radius="15dp"/>
<!-- 变化率 定义从左到右的颜色不变 -->
<solid android:color="#07ED7D"/>
</shape>
shut_track.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://scheR_78_11845@as.android.com/apk/res/android"
android:shape="rectangle">
<size android:height="30dp" android:width="30dp"/>
<corners android:radius="15dp"/>
<gradient android:startColor="#eeeeee"
android:endColor="#eeeeee"/>
<stroke android:width="1dp"
android:color="#A8A7A7"/>
</shape>
最后应用于switch效果如下
<Switch
android:id="@+id/DateSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:thumb="@drawable/thumb"
android:track="@drawable/track" />
通过监听Switch事件c;判断false和true两种状态c;分别对应控件的隐藏和显示
class SwitchListener implements CompoundButton.oncheckedChangeListener {
@Override
public void oncheckedChanged(CompoundButton buttonView, Boolean ischecked) {
switch (buttonView.getId()) {
case R.id.DateSwitch:
if (ischecked)
DateLayout.setVisibility(View.VISIBLE);
else
DateLayout.setVisibility(View.GONE);
break;
case R.id.TimeSwitch:
if (ischecked)
TimeLayout.setVisibility(View.VISIBLE);
else
TimeLayout.setVisibility(View.GONE);
break;
}
}
}
/**
* 账单记录保存到sqlite中
*/
public void Savemessage(View view) {
String date = SELEctDate.getText().toString().trim();
String time = SELEctTime.getText().toString().trim();
String type = TypeText.getText().toString();
String label = TextLabel.getText().toString();
String name = GoodsName.getText().toString();
String price = GoodsPrice.getText().toString().trim();
if (TextUtils.isEmpty(typE) || type.equals("支出or收入")){
toastutils.ShowFail("类型错误!");
return;
}
if (TextUtils.isEmpty(label) || label.equals("暂未选择")){
toastutils.ShowFail("标签错误!");
return;
}
if (TextUtils.isEmpty(Name) || TextUtils.isEmpty(pricE)){
toastutils.ShowFail("商品信息或者商品价格格式!");
return;
}
int t = type.equals("支出") ? 1 : 0;
Record record = new Record(date,time,t,label,name,pricE);
int flag = dao.Insert(record);
if (flag == 1){
toastutils.Showsuccess("保存成功!");
}else {
toastutils.ShowFail("保存失败!");
}
}
每一个标签有两种状态c;选择和不被选择状态c;分别对应两种样式效果c;一种呈灰色c;另一种呈高亮c;在进行选择时可以同时点亮多个标签c;但最后进行保存时c;只能选择一个标签c;若条件不满足c;系统给予错误提示。
class TypeListener implements View.onClickListener{
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.type_1:
setTag(type_1,getTag(type_1));
setBG(type_1,1);
break;
case R.id.type_2:
setTag(type_2,getTag(type_2));
setBG(type_2,2);
break;
case R.id.type_3:
setTag(type_3,getTag(type_3));
setBG(type_3,3);
break;
case R.id.type_4:
setTag(type_4,getTag(type_4));
setBG(type_4,4);
break;
case R.id.type_5:
setTag(type_5,getTag(type_5));
setBG(type_5,5);
break;
case R.id.type_6:
setTag(type_6,getTag(type_6));
setBG(type_6,6);
break;
case R.id.type_7:
setTag(type_7,getTag(type_7));
setBG(type_7,7);
break;
case R.id.type_8:
setTag(type_8,getTag(type_8));
setBG(type_8,8);
break;
}
}
}
每一个标签被点击c;其tag自增一次c;若未被点击c;初始值为1
private void setTag(LinearLayout layout,int tag){
tag++;
layout.setTag(tag);
}
privatE int getTag(LinearLayout layout){
Object tag = layout.getTag();
if (tag == null)return 1;
return (int) tag;
}
然后通过tag值改变标签的样式c;成偶数则高亮c;奇数则灰色c;并记录当前状态值c;同时保存被选择的标签数量。
private void setBG(LinearLayout layout,int indeX){
int tag = (int)layout.getTag();
if (tag % 2 == 0) {
layout.setBACkground(getresources().getDrawable(R.drawable.blue_radius_bg));
@R_765_10586@lNum++;
b_SELEct[index-1] = true;
}
else {
layout.setBACkground(getresources().getDrawable(R.drawable.grey_radius_bg));
@R_765_10586@lNum--;
b_SELEct[index-1] = false;
}
}
然后通过监听保存按钮点击事件c;取出状态值为true的标签值进行返回
private String SELEctTag(){
for (int i = 0; i < 8; i++) {
if ( b_SELEct[i]){
return s_SELEct[i];
}
}
return null;
}
同时监听被选择的标签总数c;若小于1c;则未选择任何标签c;给予提升;若大于1c;则选择多个标签c;同样给予提升。最后通过SharedPreferences
进行数据传回;使用Intent传输应该会更安全c;一开始设计使用EventBusc;但最后不了了。
public void Savemessage(View view){
if (@R_765_10586@lNum > 1){
toastutils.ShowFail("选择标签数量不能超过一");
}else if (@R_765_10586@lNum <= 0){
toastutils.ShowFail("选择标签数量不能少于一");
}else {
toastutils.Showsuccess("success");
String tag = SELEctTag();
Log.d(tag,"TAG="+tag);
SP sp = SP.geTinstance();
sp.putData(LabelActivity.this,"label",tag);
//EventBus.getDefault().post(new TextClass(tag));
KillProcess.POP(LabelActivity.this);
}
}
采用底部导航控件BottomNavigationView
切换账单记录界面和账单概览界面c;并通过ViewPager
进行页面滑动c;两个子页面采用两个不同的Fragment
。
次menu即为底部导航的文字和图片效果c;可以使用选择器c;监听选择和不被选择两种状态c;改变其效果。若不设置c;系统模式使用样式颜色作为高亮显示。灰色呈不被选择状态。
<menu xmlns:android="http://scheR_78_11845@as.android.com/apk/res/android">
<item
android:id="@+id/menu_navigation_record"
android:icon="@drawable/ic_home_black_24dp"
android@R_76_6964@="@String/title_record" />
<item
android:id="@+id/menu_navigation_general"
android:icon="@drawable/ic_dashboard_black_24dp"
android@R_76_6964@="@String/title_general" />
</menu>
由于本APP只需要两个节目c;故只需要创建两个fragmentc;然后在与nav进行绑定即可c;此处仅作为标记c;详细介绍如下文所示
/**
* Set a listener that will be notified when a bottom navigation item is SELEcted. This listener
* will also be notified when the currently SELEcted item is reSELEcted, unless an {@link
* OnNavigationItemReSELEctedListener} has also been set.
*
* @param listener The listener to notify
* @see #setOnNavigationItemReSELEctedListener(OnNavigationItemReSELEctedListener)
*/
设置底部导航栏当前页面显示
navView.setOnNavigationItemSELEctedListener(new BottomNavigationView.onNavigationItemSELEctedListener() {
@Override
public Boolean onNavigationItemSELEcted(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_navigation_record:
mViewPager.setCurrentItem(0);
return true;
case R.id.menu_navigation_general:
mViewPager.setCurrentItem(1);
return true;
}
return false;
}
});
将ViewPager和两个fragment进行绑定
private void setupViewPager(ViewPager viewPager) {
BottomAdapter adapter = new BottomAdapter(getSupportFragmentManager());
adapter.addFragment(new RecordFragment());
adapter.addFragment(new GeneralFragment());
viewPager.setAdapter(adapter);
}
并通过监听ViewPager事件c;进行页面切换
@H_495_216@mViewPager.addOnPageChangeListener(new ViewPager.onPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSELEcted(int position) { navView.getMenu().getItem(position).setchecked(true); } @Override public void onPageScrollStateChanged(int statE) { } }); }
此界面就比较简单c;从数据库中拿出所有数据并构建一个集合类对象c;然后放入RecyclerView中进行显示c;最后根据类型计算总支出和总收入金额
public class OrderAdapter extends RecyclerView.Adapter<OrderAdapter.ViewHolder> {
private String[] s_SELEct = {"日用百货","文化休闲","交通出行","生活服务","服装装扮","餐饮美食","数码电器","其他标签"};
privatE int[] img_SELEct = {
R.drawable.icon_type_one,
R.drawable.icon_type_two,
R.drawable.icon_type_three,
R.drawable.icon_type_four,
R.drawable.icon_type_five,
R.drawable.icon_type_six,
R.drawable.icon_type_seven,
R.drawable.icon_type_eight};
private List<Record> recordList;
public OrderAdapter(List<Record> recordList){
this.recordList = recordList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewTypE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_item,parent,falsE);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Record record = recordList.get(position);
holder.item_date.setText(record.getDate());
holder.item_time.setText("时间 "+record.getTime());
holder.item_label.setText("["+record.getLabel()+"]");
holder.item_name.setText(record.getGoodsName());
if (record.getType() == 1){
holder.item_price.setText("-"+record.getGoodsPrice());
}else {
holder.item_price.setText("+"+record.getGoodsPrice());
}
for (int i = 0; i < 8; i++) {
if (record.getLabel().equals(s_SELEct[i])){
holder.item_img.setImageresource(img_SELEct[i]);
}
}
}
@Override
public int getItemCount() {
return recordList.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView item_date,item_time,item_label,item_name,item_price;
private ImageView item_img;
public ViewHolder(@NonNull View itemView) {
super(itemView);
item_date = itemView.findViewById(R.id.item_datE);
item_time = itemView.findViewById(R.id.item_timE);
item_label = itemView.findViewById(R.id.item_label);
item_name = itemView.findViewById(R.id.item_Name);
item_price = itemView.findViewById(R.id.item_pricE);
item_img = itemView.findViewById(R.id.item_img);
}
}
}
从数据库中获取实体类集合对象c;然后根据其收入和支出两种状态计算相对应的总金额
/**
* 获取RecyclerView数据源*/
private void getData(){
recordList = dao.QueryAll();
if (recordList.size() == 0 || recordList == null){
IsEmpty(true);
return;
}
for (int i = 0; i < recordList.size(); i++) {
/**
* 1为支出
* 0为收入*/
if (recordList.get(i).getType() == 1){
@R_765_10586@lPay += Double.parseDouble(recordList.get(i).getGoodsPrice());
}else {
@R_765_10586@lIncome += Double.parseDouble(recordList.get(i).getGoodsPrice());
}
}
IsEmpty(@R_765_10586@lPay,@R_765_10586@lPay,1);
IsEmpty(@R_765_10586@lIncome,@R_765_10586@lIncome,0);
}
由于在转换格式的之后c;进行加减运算精度会失衡c;会产生很多位小数点c;但由于美观以及界面设计c;一般设计保留2位小数即可
以12.345678为例:
12.345678*100 = 1234.5678
然后将其转为整数c;则变为 1234
最后除以100.0c;此处标签c;是100.0不是100c;因为前面已经为整型数据c;整型除整型依旧为整型c;只有除100.0c;int数据类型才会强制转换为float或者double类型
private double Savedecimal(double n){
return n = ((int)(n*100))/100.0;
}
此界面显示的内容包括共计收入、支出多少笔和合计收入、支出多少金额c;以及通过标签分类显示支出、收入占比c;以及全部收入、支出记录中前三甲。
通过获取单个标签的所有金额除以全部标签的总金额c;获取百分比占比c;并通过view进行显示c;条形bar通过获取屏幕宽度c;例如:我的手机屏幕宽度为1080c;就以数码电器为例:11998.99/总金额 * 1080 = 条形bar的长度
百分比占比同样以数码电器为例:11998.99/总金额 * 100 = 数码电器百分比
public class BarAdapter extends RecyclerView.Adapter<BarAdapter.ViewHolder> {
private String[] s_SELEct = {"日用百货", "文化休闲", "交通出行", "生活服务", "服装装扮", "餐饮美食", "数码电器", "其他标签"};
privatE int[] img_SELEct = {
R.drawable.icon_type_one,
R.drawable.icon_type_two,
R.drawable.icon_type_three,
R.drawable.icon_type_four,
R.drawable.icon_type_five,
R.drawable.icon_type_six,
R.drawable.icon_type_seven,
R.drawable.icon_type_eight};
private List<ViewBar> viewBarList;
public BarAdapter(List<ViewBar> viewBarList) {
this.viewBarList = viewBarList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewTypE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.pay_type_item, parent, falsE);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
holder.item_bar.measure(w, h);
ViewBar viewBar = viewBarList.get(position);
holder.item_bar.setLayoutParams(new LinearLayout.LayoutParams(viewBar.getWidth(), viewBar.getHeight()));
holder.item_label.setText(viewBar.getLabel());
holder.item_num.setText(viewBar.getNum());
holder.item_price.setText(viewBar.getPrice());
Log.d("testLabel",viewBar.getLabel());
for (int i = 0; i < 8; i++) {
if (viewBar.getLabel().trim().equals(s_SELEct[i])){
Log.d("testLabel",viewBar.getLabel());
holder.item_img.setImageresource(img_SELEct[i]);
}
}
}
@Override
public int getItemCount() {
return viewBarList.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
private TextView item_label, item_num, item_price;
private ImageView item_img;
private View item_bar;
public ViewHolder(@NonNull View itemView) {
super(itemView);
item_label = itemView.findViewById(R.id.pay_type_label);
item_num = itemView.findViewById(R.id.pay_type_num);
item_price = itemView.findViewById(R.id.pay_type_pricE);
item_img = itemView.findViewById(R.id.pay_type_img);
item_bar = itemView.findViewById(R.id.pay_type_bar);
}
}
}
获取屏幕宽度c;以此作为基数
@H_495_216@manager = requireActivity().getWindowManager(); width = manager.getDefaultDisplay().getWidth();
private void getData(){
if (@R_765_10586@lPrice <= 0)return;
for (int i = 0; i < d_price.length; i++) {
if (d_price[i] == 0)conTinue;
int n = (int) (d_price[i] / @R_765_10586@lPrice * width);
double t = Savedecimal(d_price[i] / @R_765_10586@lPrice * 100);
barList.add(new ViewBar(s_SELEct[i]+" ",t+"%","¥"+d_price[i],n,10));
}
}
通过比较所有账单记录c;根据金额升序获取前三甲
public class RankAdapter extends RecyclerView.Adapter<RankAdapter.ViewHolder> {
privatE int[] img_SELEct = {
R.drawable.gold,
R.drawable.silver,
R.drawable.tongpai,
};
private List<RankList> rankLists;
public RankAdapter(List<RankList> rankLists){
this.rankLists = rankLists;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewTypE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.ranking_list_item,parent,falsE);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
RankList rank = rankLists.get(position);
holder.item_label.setText("["+rank.getLabel()+"]");
holder.item_content.setText(rank.getContent());
if (rank.getType() == 1){
holder.item_price.setText("-"+rank.getPrice());
}else {
holder.item_price.setText("+"+rank.getPrice());
}
switch (rank.getPosition()){
case 1:
holder.item_img.setImageresource(img_SELEct[0]);
break;
case 2:
holder.item_img.setImageresource(img_SELEct[1]);
break;
case 3:
holder.item_img.setImageresource(img_SELEct[2]);
break;
}
}
@Override
public int getItemCount() {
return rankLists.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView item_label,item_content,item_price;
private ImageView item_img;
public ViewHolder(@NonNull View itemView) {
super(itemView);
item_label = itemView.findViewById(R.id.Rank_label);
item_content = itemView.findViewById(R.id.Rank_Name);
item_price = itemView.findViewById(R.id.Rank_pricE);
item_img = itemView.findViewById(R.id.Rank_img);
}
}
}
代码虽不比递归以及排序整洁c;但是时间复杂度控制在0(n)c;效率比冒泡排序、快速排序等要高一点
/**
* 选出账单支出前三甲*/
private void getrankings(){
if (recordList.size() == 0 || recordList == null)return;
double maxPrice = -32768,midPrice = -32768,lowPrice = -32768;
int maxIndex = -1,midIndex = -1,lowIndex = -1;
for (int i = 0; i < recordList.size(); i++) {
double price = Double.parseDouble(recordList.get(i).getGoodsPrice());
if ( price > maxPricE){
lowPrice = midPrice;
lowIndex = midIndex;
midPrice = maxPrice;
midIndex = maxIndex;
maxPrice = price;
maxIndex = i;
}
if (price < maxPrice && price > midPricE){
lowPrice = midPrice;
lowIndex = midIndex;
midPrice = price;
midIndex = i;
}
if (price < maxPrice && price < midPrice && price > lowPricE){
lowPrice = price;
lowIndex = i;
}
}
int[] poi = {maxIndex,midIndex,lowIndex};
for (int i = 0; i < 3; i++) {
if (poI[i] == -1)conTinue;
rankListList.add(new RankList(i+1,recordList.get(poI[i]).getLabel(),recordList.get(poI[i]).getGoodsName(),recordList.get(poI[i]).getGoodsPrice(),recordList.get(poI[i]).getType()));
}
}
/**
* 获取单个标签总价以及所有商品总价*/
private void getPrice(){
if (recordList.size() == 0 || recordList == null)return;
d_price = new double[s_SELEct.length];
for (int i = 0; i < recordList.size(); i++) {
for (int j = 0; j < s_SELEct.length; j++) {
if (recordList.get(i).getLabel().equals(s_SELEct[j])){
d_price[j] += Double.parseDouble(recordList.get(i).getGoodsPrice());
@R_765_10586@lPrice += Double.parseDouble(recordList.get(i).getGoodsPrice());
break;
}
}
}
}
本可视化图表工具采用的是AAChartViewc;此工具相对于老牌MPChartView和HelloChartView而言c;使用更加简单c;种类更加齐全c;重点是粉粉嫩嫩c;但他的导入方式与其他不同c;不是通过导入闭包进行使用;而且通过复制它到一些文件到自己工程项目中c;其样式使用的js写的c;所有需要导入一些js文件以及一些其他java文件。这一点不比导入闭包方便。根据需要进行选择使用。
通过aa_drawChartWithChartModel()
方法获取AAChartModel
对象即可c;使用超级简单
lineChartView.aa_drawChartWithChartModel(InitLineChart());
然后可通过配置一些参数,更加形象化图表
例如:categories 为 x轴数据源c;类型为String[]
yAxisMin 为 y轴数据源最小值
yAxismax 为 y轴数据源最大值
series 为 每个数据点的提示内容c;其中name为标题;data为数据c;类型为Object[]
private AAChartModel InitLineChart() {
return new AAChartModel()
.chartType(AAChartType.AreasplinE)
.legendEnabled(false)
.yAxisVisible(true)
.markerRadius(6f)
.markerSymbolStyle(AAChartSymbolStyleType.InnerBlank)
.zoomType(AAChartZoomType.XY)
.categories(s_SELEct)
.yAxisMin(2.0f)//Y轴数据最大值和最小值范围
.yAxismax(2000.0f)
.xAxisTickInterval(2)
.series(new AASerieSELER_78_11845@ent[]{
new AASerieSELER_78_11845@ent()
.name("合计")
.color("#2494F3")
.data( getPrice())
});
}
由于需要的是Object[] 类型数据c;所有需要将String类型数据转为doublec;然后将double转为Double类型c;然后进行强制转换c;最后变为Object类型
private Object[] getPrice(){
if (recordList.size() == 0 || recordList == null)return null;
double[] d_price = new double[s_SELEct.length];
Object[] o_price = new Object[s_SELEct.length];
for (int i = 0; i < recordList.size(); i++) {
for (int j = 0; j < s_SELEct.length; j++) {
if (recordList.get(i).getLabel().equals(s_SELEct[j])){
Log.d("DetailedActivity",Double.parseDouble(recordList.get(i).getGoodsPrice())+"");
d_price[j] += Double.parseDouble(recordList.get(i).getGoodsPrice());
break;
}
}
}
for (int i = 0; i < s_SELEct.length; i++) {
o_price[i] = new Double(d_price[i]);
}
return o_price;
}
同样适用aa_drawChartWithChartModel
方法进行数据体现c;同时无论什么类型的图表类型c;都知使用AAChartView
控件c;并且只需要返回AAChartModel
对象c;这极大程度方便进行封装使用
@H_495_216@mapChartView.aa_drawChartWithChartModel(InitRoseChart());
private AAChartModel InitRoseChart() {
return new AAChartModel()
.yAxistitle("cm")
.chartType(AAChartType.column)
.xAxisVisible(false)//是否显示最外一层圆环
.yAxisVisible(true)//是否显示中间的多个圆环
.yAxisAllowdecimals(true)
.legendEnabled(false)//隐藏图例(底部可点按的小圆点)
.categories(gettitles())
.dataLabelsEnabled(true)
.polar(true)//极地化图形
.series(new AASerieSELER_78_11845@ent[]{
new AASerieSELER_78_11845@ent()
.name("价格")
.data(getRosePrice()),
}
);
}
/**
* 南丁格尔玫瑰图数据源x*/
private Object[] getRosePrice(){
if (recordList.size() == 0 || recordList == null)return null;
double[] d_price = new double[recordList.size()];
Object[] o_price = new Object[recordList.size()];
for (int i = 0; i < recordList.size(); i++) {
d_price[i] = Double.parseDouble(recordList.get(i).getGoodsPrice());
}
for (int i = 0; i < recordList.size(); i++) {
o_price[i] = new Double(d_price[i]);
}
return o_price;
}
以上是大佬教程为你收集整理的Android——一个简单的记账本APP全部内容,希望文章能够帮你解决Android——一个简单的记账本APP所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。