热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

安卓——家庭记账本8

上次实现了更多表单中的应用详情和设置(清除全部记录)的功能,接下来实现第三个功能,查看账单记录。和往常相同,首先制作页面布局  

上次实现了更多表单中的应用详情和设置(清除全部记录)的功能,接下来实现第三个功能,查看账单记录。

和往常相同,首先制作页面布局

 

 


android:layout_
android:layout_
android:orientation="vertical"
android:background="@color/grey_f3f3f3">
android:layout_
android:layout_>
android:id="@+id/history_iv_back"
android:layout_
android:layout_
android:src="@mipmap/it_back"
android:layout_marginLeft="10dp"
android:OnClick="onClick"/>
android:layout_
android:layout_
android:text="@string/history_record"
android:text
android:textSize="18sp"
android:layout_centerInParent="true"/>
android:id="@+id/history_iv_rili"
android:layout_
android:layout_
android:layout_marginRight="10dp"
android:src="@mipmap/it_rili"
android:layout_alignParentRight="true"
android:OnClick="onClick"/>

android:layout_
android:layout_
android:padding="10dp">
android:id="@+id/history_tv_time"
android:layout_
android:layout_
android:text="2021年10月"/>
android:id="@+id/history_tv_info"
android:layout_
android:layout_
android:layout_alignParentRight="true"
android:textColor="@color/green_006400"
android:text="@string/history_info"/>

android:id="@+id/history_lv"
android:layout_
android:layout_
android:divider="@null"
android:divider
android:padding="10dp" />

在这个页面中有两个点击事件,一个是返回的点击事件,直接finish()即可,另一个是查看不同时间的记录。

首先实现该页面的显示,首先在DBManger中定义一个方法,搜索数据库中的数据,并进行显示。

/*
* 获取记账表中某一月所有支出或收入情况
* */
public static List getAccountOneMonthFromAccounttb(int year,int month){
List list = new ArrayList<>();
String sql="select * from accounttb where year =? and mOnth=? order by id desc";
Cursor cursor = db.rawQuery(sql,new String[]{year+"",month+""});
//遍历符合要求的每一行数据
while(cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String typename=cursor.getString(cursor.getColumnIndex("typename"));
String beizhu=cursor.getString(cursor.getColumnIndex("beizhu"));
String time = cursor.getString(cursor.getColumnIndex("time"));
int simageId=cursor.getInt(cursor.getColumnIndex("simageId"));
int kind=cursor.getInt(cursor.getColumnIndex("kind"));
float mOney= cursor.getFloat(cursor.getColumnIndex("money"));
int day = cursor.getInt(cursor.getColumnIndex("day"));
AccountBean accountBean = new AccountBean(id,typename,simageId,beizhu,money,time,year,month,day,kind);
list.add(accountBean);
}
return list;
}

数据库的操作完成之后,进行页面的操作,首先在HistoryActivity中定义基本的变量。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_history);
historyLv = findViewById(R.id.history_lv);
timeTv = findViewById(R.id.history_tv_time);
mDatas = new ArrayList<>();
//设置适配器
adapter = new AccountAdapter(this,mDatas);
historyLv.setAdapter(adapter);
initTime();
timeTv.setText(year+"年"+month+"月");
loadData(year,month);
setLVClickListener();
}

适配器

package com.example.bookeep.adaptor;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.bookeep.R;
import com.example.bookeep.db.AccountBean;
import java.util.Calendar;
import java.util.List;
public class AccountAdapter extends BaseAdapter {
Context context;
List mDatas;
LayoutInflater inflater;
int year,month,day;
public AccountAdapter(Context context, List mDatas) {
this.cOntext= context;
this.mDatas = mDatas;
inflater=LayoutInflater.from(context);
Calendar calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
mOnth=calendar.get(Calendar.MONTH)+1;
day=calendar.get(Calendar.DAY_OF_MONTH);
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int i) {
return mDatas.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder = null;
if(view==null){
view=inflater.inflate(R.layout.item_mainlv,viewGroup,false);
holder=new ViewHolder(view);
view.setTag(holder);
}else {
holder= (ViewHolder) view.getTag();
}
AccountBean bean = mDatas.get(i);
holder.typeIv.setImageResource(bean.getSimageId());
holder.typeTv.setText(bean.getTypename());
holder.beizhuTv.setText(bean.getBeizhu());
holder.moneyTv.setText("¥"+bean.getMoney());
if(bean.getYear()==year && bean.getMonth()==month && bean.getDay()==day){
String time = bean.getTime().split(" ")[0];
holder.timeTv.setText("今天"+time);
}else {
holder.timeTv.setText(bean.getTime());
}
return view;
}
class ViewHolder{
ImageView typeIv;
TextView typeTv,beizhuTv,timeTv,moneyTv;
public ViewHolder(View view){
typeIv=view.findViewById(R.id.item_mainlv_iv);
typeTv=view.findViewById(R.id.item_mainlv_tv_title);
timeTv=view.findViewById(R.id.item_mainlv_tv_time);
beizhuTv=view.findViewById(R.id.item_mainlv_tv_beizhu);
mOneyTv=view.findViewById(R.id.item_mainlv_tv_money);
}
}
}

将这些写完之后,在页面中获取数据库中的数据,并将其显示出来。

//获取指定年份月份收支情况的列表
private void loadData(int year,int month) {
List list = DBManger.getAccountOneMonthFromAccounttb(year, month);
mDatas.clear();
mDatas.addAll(list);
adapter.notifyDataSetChanged();
}

做完这些之后,为保证细节的完整,还要保证其能够,长按删除和实时刷新功能

//设置listView的长安事件
private void setLVClickListener() {
historyLv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) {
AccountBean accountBean = mDatas.get(i);
deleteItem(accountBean);
return false;
}
});
}
private void deleteItem(final AccountBean accountBean) {
final int delId = accountBean.getId();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示信息").setMessage("你确定要删除这条记录吗?")
.setNegativeButton("取消",null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
DBManger.deleteItemFromAccounttbById(delId);
mDatas.remove(accountBean);//实时刷新
adapter.notifyDataSetChanged();
}
});
builder.create().show();
}

做完这个之后,接下来是做另一个onClick事件,作为一个日历,首先必须获取时间,然后能够点击不同的时间。

首先来做一个时间框布局

 

 


android:orientation="vertical" android:layout_
android:layout_>
android:id="@+id/item_dialogcal_hsv_tv"
android:layout_
android:layout_
android:text="2020"
android:background="@drawable/dialog_btn_bg"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="8dp"
android:layout_margin="5dp"/>

 

 


android:orientation="vertical" android:layout_
android:layout_
android:padding="5dp">
android:id="@+id/item_dialogcal_gv_tv"
android:layout_
android:layout_
android:text="2021/1"
android:padding="8dp"
android:gravity="center"
android:background="@color/grey_f3f3f3"
android:textColor="@color/black"/>

做完这些之后,在HistoryActivity中获取日历

final CalendarDialog dialog = new CalendarDialog(this,dialogSelPos,dialogSelMonth);
dialog.show();
dialog.setDialogSize();
dialog.setOnRefreshListener(new CalendarDialog.OnRefreshListener() {
@Override
public void onRefresh(int selPos, int year, int month) {
timeTv.setText(year+"年"+month+"月");
loadData(year,month);
dialogSelPos = selPos;
dialogSelMOnth=month;
}
});

最后使用switch语句将这两个点击事件关联,这个账单记录的功能就基本实现了。

今天就实现这一个功能,我认为获取数据库的数据是最重要的,其次是页面的布局和数据的显示,最后在做日立的点击事件的时候,需要注意必须使其能够停止在上次选中的位置,可以再设置两个关于时间和月份的变量。

明天实现账单详情功能 之后,这个记账小软件就基本完成了。明天需要绘制柱状图,柱状图比较难绘制。



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
author-avatar
J-cha0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有