Android第四次作业
1、团队成员:
李凌龙 161 学号:1600802015 博客:http://www.cnblogs.com/Trip1eL/
李 成 161 学号:1600802013 博客:http://www.cnblogs.com/lckzy/
赵泽泓 162 学号:1600802070 博客:http://www.cnblogs.com/magicm37/
2、APK 链接:
https://coding.net/u/Trip1eL/p/EasyCashBook/git/raw/master/EasyCashBook.apk
3、作业代码链接:
https://coding.net/u/Trip1eL/p/EasyCashBook/git
4、介绍团队项目
演示视频:https://coding.net/u/Trip1eL/p/EasyCashBook/git/raw/master/SVID_20190104_104434_1.mp4
4.1 团队项目的总体效果截图
4.2 实现的功能及其效果的描述
4.2.1新建某日消费记录并插入多条信息
4.2.2保存在本地SQLite数据库 通过ListView展示在主界面
4.2.3对已记账目进行修改
4.2.4设置记账日期
5、项目关键代码
5.1创建数据库
public class CashBookDataBase extends SQLiteOpenHelper { private static final String CREATE_TABLE_CASHBOOK = "create table cashbook (" + "id integer primary key autoincrement," + "date integer," + "name text," + "price text)"; public CashBookDataBase(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL(CREATE_TABLE_CASHBOOK); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } public void insertData(long date, String name, String price) { SQLiteDatabase db = getWritableDatabase(); db.execSQL("insert into cashbook (date, name, price) values (?, ?, ?)", new Object[]{date, name, price}); } public Cursor getDateData() { SQLiteDatabase db = getReadableDatabase(); return db.rawQuery("select date from cashbook group by date", null); } public Cursor getAllDataByDate(long Date) { SQLiteDatabase db = getReadableDatabase(); return db.rawQuery("select * from cashbook where date = ? order by date asc", new String[]{String.valueOf(Date)}); } public Cursor getData(long date) { SQLiteDatabase db = getReadableDatabase(); return db.rawQuery("select * from cashbook where date >= ? order by date asc", new String[]{String.valueOf(date)}); } public void deleteData(long date) { SQLiteDatabase db = getWritableDatabase(); db.execSQL("delete from cashbook where date = ?", new String[]{String.valueOf(date)}); } }
5.2 Listview(实现显示和编辑功能前提)
public CashBookListView(Context context, AttributeSet attrs) { super(context, attrs); mGestureDetector = new GestureDetector(getContext(), this); setOnTouchListener(this); } @Override public boolean onDown(MotionEvent motionEvent) { if (!bIsDeleteBtnShow) { mItemPosition = pointToPosition((int)motionEvent.getX(), (int)motionEvent.getY()); } return false; } @Override public void onShowPress(MotionEvent motionEvent) { } @Override public boolean onSingleTapUp(MotionEvent motionEvent) { return false; } @Override public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { return false; } @Override public void onLongPress(MotionEvent motionEvent) { } @Override public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { if (!bIsDeleteBtnShow && Math.abs(v) > Math.abs(v1)) { mBtnView = LayoutInflater.from(getContext()).inflate(R.layout.layout, null); mBtnView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { mItemLayout.removeView(mBtnView); mBtnView = null; bIsDeleteBtnShow = false; } }); mItemLayout = (ViewGroup) getChildAt(mItemPosition - getFirstVisiblePosition()); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); layoutParams.addRule(RelativeLayout.CENTER_VERTICAL); mItemLayout.addView(mBtnView, layoutParams); bIsDeleteBtnShow = true; } return false; } @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (bIsDeleteBtnShow) { mItemLayout.removeView(mBtnView); bIsDeleteBtnShow = false; mBtnView = null; return false; } else { return mGestureDetector.onTouchEvent(motionEvent); } } }
5.3
protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == 0 && data != null) { List<String> name = (List<String>) data.getSerializableExtra("name"); List<String> price = (List<String>) data.getSerializableExtra("price"); long date; int numName = name.size(); int numPrice = price.size(); long date_tmp = data.getLongExtra("date", -1); if (date_tmp != -1) { date = date_tmp; mDataBaseHelper.deleteData(date); } else { date = System.currentTimeMillis(); } int i, j; i = (numName >= numPrice ? numName : numPrice); for (j = 0; j < i; j++) { mDataBaseHelper.insertData(date, name.get(j), price.get(j)); } updateDataFromDB(); } }
6、项目对比
1、李怡龙小组:这个项目就是存储用户信息的一个项目,通过用户的注册,来存储用户的信息,优点就是简单明了实用性强,功能实现完整且精确,存在缺点有时会跳BUG。
2、韩璐组音乐播放器:实现了音乐播放器的基本功能,但存在界面优化不足的缺点,对模拟器要求较高。
3、周丽丽组音乐播放器:同样实现了音乐播放器的基本功能,功能实现完整但界面不够美观,优化不够。对高版本API有闪退的现象。
4、毛建小组:所做的校园头条,实现了查看新闻,用列表展示新闻的功能采用了两个界面,但界面布局感觉有些怪异,没有实现实时更新新闻的功能,相关的功能块也不能跳转。
5、马进财小组:界面基本实现,但点功能块时会出现闪退现象。
7、问题及解决方法
7.1数据库无法更新数据:1600802015李凌龙
起初设计完成后没有在MainActivity.java中的onCreat方法中启动数据库导致一直无法开启App启动数据库 后续在代码中添加代码后解决
mDataBaseHelper = ((CashBookApplication)getApplication()).getDataBaseHelper();
updateDataFromDB();
7.2ListView显示账目问题:1600802015李凌龙
查阅网络资料 理解了ListView工作原理最后解决如下
public View getView(int position, View convertView, ViewGroup parent) { CashBook cashBook = getItem(position); View view; ViewHolder viewHolder; if (convertView == null) { view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false); viewHolder = new ViewHolder(); viewHolder.date = (TextView) view.findViewById(R.id.txt_date); viewHolder.content = (TextView) view.findViewById(R.id.txt_content); view.setTag(viewHolder); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } viewHolder.date.setText(StampToDate.StampConvertToDate(cashBook.getDate())); viewHolder.content.setText(cashBook.getContent()); return view; } class ViewHolder { TextView date; TextView content; }
7.3 如何实现日期:1600802013李成
初期是打算设计为手动输入日期,后来查阅Google官方资料 官方有相关组件 于是最终选择直接利用组件
switch (view.getId()) { case R.id.btn_datepicker: DatePickerDialog dialog = new DatePickerDialog(AddCashBookActivity.this, 0, dateSetListener, Calendar.getInstance().get(Calendar.YEAR), Calendar.getInstance().get(Calendar.MONTH), Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); dialog.show(); break; default: break; }
7.4 如何插入多条数据:1600802013李成
在创建时把数据放在同一行 显示时用逗号分开
7.5 编辑数据:赵泽泓 1600802070
点击ListView中显示的数据 将数据所在的数据打开在创建的页面里 进行编辑 重新写入数据库
7.6 创建功能:赵泽泓 1600802070
起初无法直接写入数据库 最后通过在DBHelper中修改insertData方法直接把数据插入数据库
public void insertData(long date, String name, String price) { SQLiteDatabase db = getWritableDatabase(); db.execSQL("insert into cashbook (date, name, price) values (?, ?, ?)", new Object[]{date, name, price}); }
8分工安排
姓名 | 分工 | 工作比例 | 分数 |
李凌龙 | 数据库设计、UI设计 | 34% | 10 |
李成 | 数据功能、按键功能 | 33% | 10 |
赵泽泓 | 编辑,创建功能实现 | 33% | 10 |