1. 程式人生 > 實用技巧 >2021年寒假生活日報告-第五天 (android開發記賬本進度四)

2021年寒假生活日報告-第五天 (android開發記賬本進度四)

今日android開發進度:

(一)首先,製作一個記賬本的頁面。

①在系統自動建立的content_main.xml檔案中新增listview.

②建立一個list_item.xml來實現見記賬本的頁面佈局,一共需要三個元件,一個是記賬資訊,記賬時間,記賬金額.

③編寫介面卡並進行測試,因此我們需要建立一個CostListAdapter.java,還需要建立我們的bean物件,因此需要在建立一個CostBean來儲存我們的記賬資訊。

④再然後在主程式中獲取ListView並設定adapter,並進行介面卡的測試。

(二)進行資料庫的操作。

①建立資料庫實現增/刪/查的方法實現。在這裡新建了一個“imooc_daily”的資料庫和“imooc_cost”表,並對他們以及資料資訊(cost_title,cost_date,cost_money)

進行了常量定義,以便其他程式的使用,並寫了簡單的增加、刪除和查詢資料的功能。

(三)開始構建一些業務邏輯,開始構建記賬本的新增一筆記賬的功能。

①對fab按鈕的click時間進行修改,建立一個AlertDialog.Builder物件,因此我們給dialog新增一個佈局,命名為new_cost_data.xml,位於他的佈局很簡單,我們

只需要設定兩個編輯框,和一個時間選擇框即可。

②然後回到主程式,在fab點選事件裡建立一個LayoutInflater用他來建立view,將新佈局傳到新建立的View物件,這樣就可以獲取到佈局檔案的內容,獲取後將該佈局設定給dialog物件,然後需要給dialog設定監聽事件,當點選ok的監聽事件,就將從佈局中獲取的資訊傳給一個CostBean物件,在用資料庫進行新增,收集資料的mCostBeanList物件也要進行新增,最後再重新整理(mAdapter.notifyDataSetChanged();),點選cancel就會取消該view介面,最後不要忘了顯示該dialog。

(四)開始製作圖表

圖表的製作我們會用到第三方庫hellocharts,具體可以登入該網址檢視————https://github.com/lecho/hellocharts-android

接下來在Android Studio中匯入該庫,在build中的dependencies中匯入該github就可以了.

java目錄下的類及程式碼:

1.MainActivity

package com.example.family;

import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.os.PersistableBundle;
import android.renderscript.Sampler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {

private List<CostBean> mCostBeanList;
private DatabaseHelper mDatabaseHelper;
private CostListAdapter mAdapter;
private TextView costTotal;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mDatabaseHelper = new DatabaseHelper(this);
mCostBeanList = new ArrayList<>();
ListView costList = (ListView) findViewById(R.id.lv_main);
initCostData();
System.out.println("**********"+mCostBeanList);
mAdapter =new CostListAdapter(this,mCostBeanList);
costList.setAdapter(mAdapter);

Button btn_add_in =findViewById(R.id.btn_add_in);
btn_add_in.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
View viewDialog=inflater.inflate(R.layout.new_cost_data,null);
final EditText title=(EditText)viewDialog.findViewById(R.id.et_cost_title);
final EditText money=(EditText)viewDialog.findViewById(R.id.et_cost_money);
final DatePicker date=(DatePicker) viewDialog.findViewById(R.id.dp_cost_date);
builder.setView(viewDialog);
builder.setTitle("新增收入");
builder.setPositiveButton("確認", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final CostBean costBean=new CostBean();
costBean.costTitle=title.getText().toString();
costBean.costDate=date.getYear() + "-" + (date.getMonth()+1) + "-" +
date.getDayOfMonth();
costBean.costMoney="+"+money.getText().toString();
mDatabaseHelper.insertCost(costBean);
mCostBeanList.add(costBean);
mAdapter.notifyDataSetChanged();
String string_total_cost="賬戶餘額:"+mDatabaseHelper.countTotalCost();
costTotal =findViewById(R.id.tv_cost_total);
costTotal.setText(string_total_cost);
}
});
builder.setNegativeButton("取消",null);
builder.create().show();
}
});

/**
* 支出
*/
Button btn_add_out =findViewById(R.id.btn_add_out);
btn_add_out.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
View viewDialog=inflater.inflate(R.layout.new_cost_data,null);
final EditText title=(EditText)viewDialog.findViewById(R.id.et_cost_title);
final EditText money=(EditText)viewDialog.findViewById(R.id.et_cost_money);
final DatePicker date=(DatePicker) viewDialog.findViewById(R.id.dp_cost_date);
builder.setView(viewDialog);
builder.setTitle("新增支出");
builder.setPositiveButton("確認", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final CostBean costBean=new CostBean();
costBean.costTitle=title.getText().toString();
costBean.costDate=date.getYear() + "-" + (date.getMonth()+1) + "-" +
date.getDayOfMonth();
costBean.costMoney="-"+money.getText().toString();
mDatabaseHelper.insertCost(costBean);
mCostBeanList.add(costBean);
mAdapter.notifyDataSetChanged();
String string_total_cost="賬戶餘額:"+mDatabaseHelper.countTotalCost();
costTotal =findViewById(R.id.tv_cost_total);
costTotal.setText(string_total_cost);
}
});
builder.setNegativeButton("取消",null);
builder.create().show();
}
});

/*
刪除
*/
Button btn_delete = findViewById(R.id.btn_delete);
btn_delete.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
View viewDialog=inflater.inflate(R.layout.delete_cost_data,null);
final EditText title=(EditText)viewDialog.findViewById(R.id.et_cost_title);
builder.setView(viewDialog);
builder.setTitle("刪除賬單");
builder.setPositiveButton("刪除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
CostBean costBean =new CostBean();
costBean.costTitle=title.getText().toString();
mDatabaseHelper.deleteCost(costBean);
mCostBeanList.clear();
initCostData();
mAdapter.notifyDataSetChanged();
String string_total_cost="賬戶餘額:"+mDatabaseHelper.countTotalCost();
costTotal =findViewById(R.id.tv_cost_total);
costTotal.setText(string_total_cost);
}
});
builder.setNegativeButton("取消",null);
builder.create().show();
}
});

/*
清除賬單
*/
Button btn_delete_all =findViewById(R.id.btn_delete_all);
btn_delete_all.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mDatabaseHelper.deleteAllData();
mCostBeanList.clear();
mAdapter.notifyDataSetChanged();
String string_total_cost="賬戶餘額:"+mDatabaseHelper.countTotalCost();
costTotal =findViewById(R.id.tv_cost_total);
costTotal.setText(string_total_cost);
}
});
builder.setNegativeButton("取消",null);
builder.setMessage("確定要清除所有賬單嗎?");
builder.setTitle("提示");
builder.create().show();
}
});

/*
計算餘額
*/

}

/*
初始化表單
*/
private void initCostData() {
Cursor cursor=mDatabaseHelper.getAllCostData();
if(cursor!=null){
while(cursor.moveToNext()){
CostBean costBean=new CostBean();
costBean.costTitle=cursor.getString(cursor.getColumnIndex("cost_title"));
costBean.costDate=cursor.getString(cursor.getColumnIndex("cost_date"));
costBean.costMoney=cursor.getString(cursor.getColumnIndex("cost_money"));
mCostBeanList.add(costBean);
String string_total_cost="賬戶餘額:"+mDatabaseHelper.countTotalCost();
costTotal =findViewById(R.id.tv_cost_total);
costTotal.setText(string_total_cost);
}
cursor.close();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_chart) {
Intent intent=new Intent(MainActivity.this,ChartsActivity.class);
intent.putExtra("cost_list", (Serializable) mCostBeanList);
startActivity(intent);
return true;
}


return super.onOptionsItemSelected(item);
}
}

2.CostListAdapter
package com.example.family;

import android.content.Context;
import android.graphics.ColorSpace;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;

import java.util.List;

public class CostListAdapter extends BaseAdapter{

private List<CostBean> mList;
private Context mContext;
private LayoutInflater mLayoutInflater;

public CostListAdapter(Context context,List<CostBean> list){
mContext=context;
mList=list;
mLayoutInflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
System.out.println(mList.size());
return mList.size();
}

@Override
public Object getItem(int position) {
return mList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView==null){
viewHolder=new ViewHolder();
convertView=mLayoutInflater.inflate(R.layout.list_item,null);
viewHolder.mTvCostTitle=(TextView)convertView.findViewById(R.id.tv_title);
viewHolder.mTvCostDate=(TextView)convertView.findViewById(R.id.tv_date);
viewHolder.mTvCostMoney=(TextView)convertView.findViewById(R.id.tv_cost);
convertView.setTag(viewHolder);
}else{
viewHolder=(ViewHolder) convertView.getTag();
}
CostBean bean=mList.get(position);
viewHolder.mTvCostTitle.setText(bean.costTitle);
viewHolder.mTvCostDate.setText(bean.costDate);
viewHolder.mTvCostMoney.setText(bean.costMoney);
return convertView;
}

private static class ViewHolder{
public TextView mTvCostTitle;
public TextView mTvCostDate;
public TextView mTvCostMoney;
}
}

3.CostBean
package com.example.family;

import java.io.Serializable;

public class CostBean implements Serializable{
public String costTitle;
public String costDate;
public String costMoney;
}

4.DatabaseHelper

package com.example.family;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.TextView;

import androidx.annotation.Nullable;


public class DatabaseHelper extends SQLiteOpenHelper {

public static final String COST_MONEY = "cost_money";
public static final String COST_DATE = "cost_date";
public static final String COST_TITLE = "cost_title";
public static final String TABLE = "family";

public DatabaseHelper(@Nullable Context context) {
super(context, TABLE, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists family("+
"id integer primary key autoincrement ,"+
"cost_title varchar,"+
"cost_date varchar,"+
"cost_money varchar)");
}

public void insertCost(CostBean costBean){
SQLiteDatabase database=getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put(COST_TITLE,costBean.costTitle);
cv.put(COST_DATE,costBean.costDate);
cv.put(COST_MONEY,costBean.costMoney);
database.insert(TABLE,null,cv);
}

public void deleteCost(CostBean costBean){
SQLiteDatabase database=getWritableDatabase();
database.delete(TABLE,"cost_title=?",new String[]{costBean.costTitle});
}

// public void deleteCost(int position){
// SQLiteDatabase database=getWritableDatabase();
// database.delete(TABLE,"id=?",new String[]{Integer.toString(position)});
// }

public Cursor getAllCostData(){
SQLiteDatabase database=getWritableDatabase();
return database.query(TABLE,null,null,null,null,null,COST_DATE+" ASC");
}

public void deleteAllData(){
SQLiteDatabase database=getWritableDatabase();
database.delete(TABLE,null,null);
}

public int countTotalCost(){
int sum=0;
SQLiteDatabase database=getWritableDatabase();
String sum_dbString="select sum(cost_money)from "+TABLE;
Cursor cursor=database.rawQuery(sum_dbString,null);
if (cursor!=null){
if (cursor.moveToFirst()){
do{
sum=cursor.getInt(0);
}while (cursor.moveToNext());
}
}
return sum;
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

}
5.ChartsActivity
package com.example.family;

import android.app.Activity;
import android.os.Bundle;

import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import lecho.lib.hellocharts.model.ChartData;
import lecho.lib.hellocharts.model.Line;
import lecho.lib.hellocharts.model.LineChartData;
import lecho.lib.hellocharts.model.PointValue;
import lecho.lib.hellocharts.model.ValueShape;
import lecho.lib.hellocharts.util.ChartUtils;
import lecho.lib.hellocharts.view.Chart;
import lecho.lib.hellocharts.view.LineChartView;

public class ChartsActivity extends Activity {

private LineChartView mChart;
private Map<String,Integer> table=new TreeMap<>();
private LineChartData mData;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chart_view);
mChart=(LineChartView) findViewById(R.id.chart);
mData=new LineChartData();
List<CostBean> allDate= (List<CostBean>) getIntent().getSerializableExtra("cost_list");
generateValues(allDate);
generateData();
}

private void generateData() {
List<Line> lines=new ArrayList<>();
List<PointValue> values=new ArrayList<>();
int indexX=0;
for (Integer value:table.values()){
values.add(new PointValue(indexX,value));
indexX++;
}
Line line=new Line(values);
line.setColor(ChartUtils.COLORS[0]);
line.setShape(ValueShape.CIRCLE);
line.setPointColor(ChartUtils.COLORS[1]);
lines.add(line);
mData =new LineChartData(lines);
mData.setLines(lines);
mChart.setLineChartData(mData);
}

private void generateValues(List<CostBean> allDate) {
if(allDate!=null){
for(int i=0;i<allDate.size();i++){
CostBean costBean=allDate.get(i);
String costDate=costBean.costDate;
int costMoney=Integer.parseInt(costBean.costMoney);
if (!table.containsKey(costDate)){
table.put(costDate,costMoney);
}else{
int originMoney=table.get(costDate);
table.put(costDate,originMoney+costMoney);
}
}
}
}
}