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
posted @ 2018-12-28 14:44  Trip1eL  阅读(234)  评论(0编辑  收藏  举报