程序eShoppingNote 用于记录网上购物的情况, 记录购买的日期,购买了什么,从哪儿买的,消费金额等。每月汇总,可做简单的分析,比如从不同渠道(网站)购买的比例,购买物品的类型比例等。
- 界面描述:
- 主界面(eShoppingNote)包含三个按钮(编辑,添加),已购买物品列表和数据分析饼图,数据分析部分放在第二部分实现.
- l添加/编辑界面(ShoppingDetails)包含 日期输入框EditText android:inputType="date"(购买日期),文本输入框(购买物品)EditText,物品类型,购买渠道AutoCompleteTextView,购买金额EditText android:inputType="numberDecimal"”提交按钮Button android:text="Submit" android:id="@+id/btnSubmit"
- 实现
- 添加时购物日期缺省为当前日期
SimpleDateFormat datefmt = new SimpleDateFormat("yyyy-MM-dd");
item =(EditText)findViewById(R.id.shoppingDate);
item.setText(datefmt.format(new java.util.Date()));
- AutoCompleteTextView, 自动提示输入框,默认情况下须输入两个或者两个以上的字符,自动匹配提示剩余字符. 可以通过setThresh来设置至少输入几个字符后才会有提示,也可以在xml里设置.
- MultiAutoCompleteTextView, 与AutoCompleteTextView,但可以根据提供tokenizer(setTokenizer 方法)来分解你已经输入的字符串,达到多了字符串的匹配输入。AutoCompleteTextView/MultiAutoCompleteTextView 需要结合ArrayAdapter绑定数据来实现。
例子:
*.xml中定义AutoCompleteTextView 控件
<AutoCompleteTextView
android:id="@+id/ShoppingFrom"
android:text="AutoCompleteTextView"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
*.java中设置数据,并绑定
private static final String[] autoString = new String[]{"taobao","360Buy","Joyo","Sina","Dangdang"};
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AutoCompleteTextView actv = (AutoCompleteTextView)findViewById(R.id.ShoppingFrom);
//创建ArrayAdapter对象并将autoStr字符串数组绑定到actv中
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, autoString);
actv.setAdapter(adapter);
// 设置输入3字符后提示,默认值为2
actv.setThreshold(3);
}
如果是MultiAutoCompleteTextView 需要设置tokenizer,即
// 下列用逗号来分隔。例如用户输入”ta”后可匹配出”taobao”,然后用户接着输入”,36”可匹配出360buy,则输入框中的显示是”taobao,360buy”
multiAutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
- 创建数据库和表。 如果数据库/数据库不存在则创建之数据库
shoppingDB = this.openOrCreateDatabase(DB_Name,Context.MODE_WORLD_WRITEABLE, null);
String createTableStr = "create table " + Table_Name +"(_id integer primary key autoincrement," +
"ShoppingDate text not null, GoodsType text, ShoppingFrom text, ShopingDesc text, ShoppingExpend real);";
shoppingDB.execSQL(createTableStr); - 从数据库表中读出数据并显示到Listview中。主UI中定义Listview控件,然后单独建立一个xml定义各数据字段的显示
String strSQL = "select * from "+Table_Name;
Cursor shoppingList = shoppingDB.rawQuery(strSQL, null);
if(shoppingList.moveToNext()){
startManagingCursor(shoppingList);
System.out.println(true);}
ListView lv = (ListView)findViewById(R.id.listShopping);
SimpleCursorAdapter sadt = new SimpleCursorAdapter(this,R.layout.shoppinglist,shoppingList,
new String[]{"_id","ShoppingDate","GoodsType","ShoppingFrom" ,"ShopingDesc" ,"ShoppingExpend" },
new int[]{R.id.serials,R.id.shoppingDate,R.id.goodzType,R.id.ShoppingFrom,R.id.shoppingDesc,R.id.shoppingExpend});
lv.setAdapter(sadt);
- Activity的切换和intent传数据
- 在主界面eShoppingNote中点击Add/Edit按钮将切换到ShoppingDetails界面, 添加时设置Intent的活动类型为Intent.ACTION_MAIN, 编辑时设置Intent的活动类型为Intent.ACTION_EDIT
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClass(eShoppingNote.this, ShoppingDetails.class);
startActivityForResult(intent,ADD_NEWRECORD); - 在ShoppingDetails界面完成新数据添加或原数据修改后,按Submit按钮将数据返回到eShoppingNote主界面。
Intent intent = new Intent();
intent.putExtra("ShoppingDate", strShoppingDate);
...
setResult(Activity.RESULT_OK,intent);
ShoppingDetails.this.finish(); - 主界面中重写(override)onActivityResult方法,,保存到数据库并更新界面显示
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent){
super.onActivityResult(requestCode, resultCode, intent);
if(resultCode == Activity.RESULT_CANCELED) return;
switch(requestCode)
{
case ADD_NEWRECORD:
InsertDataToDB(intent);
break;
case EDIT_RECORD:
UpdateDataToDB(intent);
break;
}
ReadDataFromDB(); }
- 在主界面eShoppingNote中点击Add/Edit按钮将切换到ShoppingDetails界面, 添加时设置Intent的活动类型为Intent.ACTION_MAIN, 编辑时设置Intent的活动类型为Intent.ACTION_EDIT
- 运行结果
- Tips:
- n 文件名只能是小写字母和数字否则报“Invalid file name: must contain only [a-z0-9_.]”错误
- 读取Cursor中的数据时,首先要判断cursor是否为空(没有数据),用getcount()==0判断。在浏览数据时为避免游标越界(错误提示ndroid.database.CursorIndexOutOfBoundsException: Index ? requested, with a size of ?)首先要moveToFirst().