android软件简约记账app开发day05-记账页面条目代码优化和bug解决
android软件简约记账app开发day05-记账页面条目代码优化和bug解决
今天还是因为该bug又极大的耽误了项目进程,该开发文档都要没有时间来写了。
先说bug吧,在昨天已经实现了页面图标的展示,并且可以左右滑动来切换时支出还时收入页面,可就是在页面上部不显示支出和收入,这让我百思不得其解,翻看项目目录也不知道时那里的问题,我首先试了试Debug来看一下,我打了几个断点,可以当我点击那个晓聪子按钮时,他还让我下载什么东西,我心想我就调试一下,你就每一步就给我走不就完了,还要下载什么东西,真是无语,算了,还是下吧,可我这一点击download,这要下载的东西可多啊,愣是下了得有5分钟,当我下载完后,本以为点击debug按钮后该bug就能简简单单的解决时,知识砂纸擦屁股给我露了一手啊,这来来回回跳转的类得有百十来个,我点啊点,看呀看,是又点不玩,又看不到,来回挑战java类,也还不加载页面,我心想写个日志看看能打印出什么来不,可他就是出不来,什么也输出不了。
其次我就放弃了调试,选择从头梳理一下逻辑,既然能加载,说明记一笔可以点击,并且页面可以跳转,条目可以显示,说明从数据库角度来说没有问题,我相当于又从头看了一下所有昨天写的代码,终于我点进了写的适配器类RecordPagerAdapter我发现在我定义的String[] titles={"支出","收入"};竟然是灰的,这属实让我心头一紧,我立马就发现了
public CharSequence getPageTitle(int position) {
return titles[position];
}
该类没改return,当然这是改过之后的,这、啊这、啊这这这、哎,我就无语,怎么能有我这么菜的人。
现在看着写起来也就四五百字,这可是四五个小时才发现的。。。。。。
接下来,让我来优化一下代码,稍微、简单的优化一下,把outcomefragment和incomefragment两个类的相同部分抽取一下,写成baserecordfragment类,在用两个类继承一下。
package com.open.tally.frag_record;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import com.open.tally.R;
import com.open.tally.db.AccountBean;
import com.open.tally.db.DBManager;
import com.open.tally.db.TypeBean;
import com.open.tally.util.KeyBoardUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
/**
* 记录页面的支出模块
*/
public class BaseRecordFragment extends Fragment {
KeyboardView keyboardView;
EditText moneyEt;
ImageView typeIv;
TextView typeTv, beizhuTv, timeTv;
GridView typeGv;
List<TypeBean> typeList;
TypeBaseAdapter adapter;
AccountBean accountBean;//保存到数据库中使用的封装类
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
accountBean=new AccountBean();
accountBean.setTypename("其他");
accountBean.setsImageId(R.mipmap.ic_qita_fs);
}
public BaseRecordFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_outcome, container, false);
initView(view);
setInitTime();
loadDataToGV();
setGVListener();//设置每一项的gradeView的点击事件
return view;
}
/**
* 获取当前时间
*/
private void setInitTime(){
Date date=new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH: mm");
String time=sdf.format(date);
timeTv.setText(time);
accountBean.setTime(time);
Calendar calendar=Calendar.getInstance();
int year=calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH)+1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
accountBean.setYear(year);
accountBean.setMonth(month);
accountBean.setDay(day);
}
/**
* 设置每一项的gradeView的点击事件
*/
private void setGVListener() {
typeGv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
adapter.selectPos=i;
adapter.notifyDataSetInvalidated();
TypeBean typeBean = typeList.get(i);
String typename = typeBean.getTypename();
typeTv.setText(typename);
int simageId = typeBean.getSimageId();
typeIv.setImageResource(simageId);
accountBean.setsImageId(simageId);
accountBean.setTypename(typename);
}
});
}
/**
* 给GridView填充数据的方法
*/
private void loadDataToGV(){
typeList=new ArrayList<>();
adapter = new TypeBaseAdapter(getContext(), typeList);
typeGv.setAdapter(adapter);
//获取数据库当中数据源
List<TypeBean> outlist = DBManager.getTypeList(0);
typeList.addAll(outlist);
adapter.notifyDataSetChanged();
}
private void initView(View view) {
keyboardView = view.findViewById(R.id.frag_record_keyboard);
moneyEt = view.findViewById(R.id.frag_record_et_money);
typeIv = view.findViewById(R.id.frag_record_iv);
typeGv = view.findViewById(R.id.frag_record_gv);
typeTv = view.findViewById(R.id.frag_record_tv_type);
beizhuTv = view.findViewById(R.id.frag_record_tv_beizhu);
timeTv = view.findViewById(R.id.frag_record_tv_time);
//显示自定义软键盘
KeyBoardUtils keyBoardUtils = new KeyBoardUtils(keyboardView, moneyEt);
keyBoardUtils.showKeyboard();
//设置接口监听确定按钮被点击了
keyBoardUtils.setOnEnsureListener(new KeyBoardUtils.OnEnsureListener() {
@Override
public void onEnsure() {
//获取收入钱数
String moneyStr = moneyEt.getText().toString();
if (!TextUtils.isEmpty(moneyStr)||moneyStr.equals("0")){
getActivity().finish();
return;
}
float money=Float.parseFloat(moneyStr);
accountBean.setMoney(money);
//点击了确定按钮
//获取用户输入的信息
//返回上一级界面
getActivity().finish();
}
});
}
}
最后写了一个账单类来存储用户打算存的账单信息。
package com.open.tally.db;
/**
* 将数据插入到数据库的封装类
*/
public class AccountBean {
int id;
String typename;
int sImageId;
String beizhu;
float money;
String time;
int year;
int month;
int day;
int kind;//收入1,支出0
public AccountBean() {
}
public AccountBean(int id, String typename, int sImageId, String beizhu, float money, String time, int year, int month, int day, int kind) {
this.id = id;
this.typename = typename;
this.sImageId = sImageId;
this.beizhu = beizhu;
this.money = money;
this.time = time;
this.year = year;
this.month = month;
this.day = day;
this.kind = kind;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTypename() {
return typename;
}
public void setTypename(String typename) {
this.typename = typename;
}
public int getsImageId() {
return sImageId;
}
public void setsImageId(int sImageId) {
this.sImageId = sImageId;
}
public String getBeizhu() {
return beizhu;
}
public void setBeizhu(String beizhu) {
this.beizhu = beizhu;
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getKind() {
return kind;
}
public void setKind(int kind) {
this.kind = kind;
}
}
好了明天再见把,呜呜呜~~~~~
android软件简约记账app开发day05-记账页面条目代码优化和bug解决的更多相关文章
- android软件简约记账app开发day08-时间对话框的书写+改bug,改bug
android软件简约记账app开发day08-时间对话框的书写+改bug,改bug 绘制对话跨页面 在添加记账信息功能中,我提供了用户添加备注添加事件的功能,设计是点击时间会弹出一个时间对话框供用户 ...
- android软件简约记账app开发day06-将记账条目添加到数据库并且绘制备注页面
android软件简约记账app开发day06-将记账条目添加到数据库并且绘制备注页面 首先写添加到数据库 在DBOpenHelper中添加创建记账表的语句 //创建记账表 sql = "c ...
- android软件简约记账app开发day10-主页面模块--头信息的展示,和之后功能完善的目标。
android软件简约记账app开发day10-主页面模块--头信息的展示,和之后功能完善的目标. 今天来写主界面头信息的展示,也就是将第一天的写的layout中的item_main_top展示到主界 ...
- android软件简约记账app开发day09-主页面模块,收支记账信息的展示
android软件简约记账app开发day09-主页面模块,收支记账信息的展示 我们第一天已经绘制了记账条目的界面,也在主界面设置了LietView来展示记账条目,今天来实现记账后再主界面的展示效果 ...
- android软件简约记账app开发day07-备注界面完善
android软件简约记账app开发day07-备注界面完善 ## 昨天我们已经绘制了备注页面,今天来用Java代码组装完善一下. 首先我们新建BeiZhuDialog类关联备注页面,并且实现点击接口 ...
- android软件简约记账app开发day04-记账页面条目的代码书写
android软件简约记账app开发day04-记账页面条目的代码书写 在前三天我们完成了基本的界面展示,从今天开始,我们进入到后台逻辑代码的编写中,今天开发记账条目的代码 我们在主页面点击记一笔图标 ...
- android软件简约记账app开发day03-自定义键盘的书写
android软件简约记账app开发day03-自定义键盘的书写 我们在fragment界面使用了自定义的keybroad键盘,所以今天我们来书写自定义的键盘代码 新建util包,新建keyboard ...
- android软件简约记账app开发day02-收入支出明细页面绘制
android软件简约记账app开发day02-收入支出明细页面绘制 效果图 列表界面绘制 新建layout文件-item_mainlv.xml大体使用绝对布局,嵌套相对布局,嵌套文本内容实现 < ...
- android软件简约记账app开发day01-今日收支明细的界面绘制
android软件简约记账app开发day01-今日收支明细的界面绘制 导入素材 导入在阿里iconfront图标库下载的字体图标分为大小两种,分别导入到项目目录mipmap-hdpi和mipmap- ...
随机推荐
- Linux 进程打开最大文件连接数Too many open files
首先出现这个提示的原因:应用程序打开的文件数量超过了系统设定值. 如何查看当前系统每个用户最大允许打开文件数量: [root@registry ~]# ulimit -a core file size ...
- WIRESHARK 提取百度云客户端中的下载地址
序言:近两年感觉云盘是越来越不行了,什么115,360,华为,新浪一些网盘纷纷关门,现在手里能用的就只剩下一个百度云坚挺着.可那速度,简直感人,好吧,没钱冲VIP,就去找了一个破解版,用了一年,爽得飞 ...
- IC设计基础
一 前言 这一周连续两场线下面试,紧接着又是微信视频面试,从连续三天的面试中,收获颇丰! 存在的问题: 一是对项目细节模糊: 二是IC基础知识薄弱: 具体表现是,在面试过程中,如被问到DDR3和千兆以 ...
- 羽夏看Win系统内核——调试篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- HTTPS-各种加密方式
推荐阅读:https://www.cnblogs.com/zwtblog/tag/计算机网络/ 目录 HTTPS 对称加密(AES) 非对称加密(RSA) 工作过程 分析 优缺点 常用算法 混合加密 ...
- 内置对象session和application的作用是什么?
Jsp调用Javeabean命令UseBean中有Scope设置,一般有Application session page等设置,Page就是每页重新产生usebean中的javabean新对象,一般情 ...
- 什么是消费者驱动的合同(CDC)?
这基本上是用于开发微服务的模式,以便它们可以被外部系统使用.当我们处理 微服务时,有一个特定的提供者构建它,并且有一个或多个使用微服务的消费者. 通常,提供程序在 XML 文档中指定接口.但在消费者驱 ...
- HTML 5的页面结构和HTML 4或早先的HTML有什么不同?
一个典型的Web页面有页眉(header),页脚(footer),导航(navigation),正文(central area)和侧栏(side bar).现在如果是在HTML 4中,HTML部分中的 ...
- MyBatis Plus 2.3 个人笔记-01-代码生成器
sb_mybatis_puls2.3 <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- Python这些位运算的妙用,绝对让你大开眼界
位运算的性能大家想必是清楚的,效率绝对高.相信爱好源码的同学,在学习阅读源码的过程中会发现不少源码使用了位运算.但是为啥在实际编程过程中应用少呢?想必最大的原因,是较为难懂.不过,在面试的过程中,在手 ...