• 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
  • 相关阅读:
    平衡二叉树(AVL Tree)
    算法分析
    稳定匹配
    Python读取不同文件夹下的图片并且分类放到新创建的训练文件夹和标签文件夹
    java构造函数也可以用private开头
    基于slf4j的log4j实战
    javascript权威指南第6版学习笔记
    hadoop之wordCount程序理解
    java 基本类型和包装类的比较
    设计模式之工厂模式,单例模式,门面模式
  • 原文地址:https://www.cnblogs.com/Trip1eL/p/10190488.html
Copyright © 2020-2023  润新知