【该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材】
【项目题目】:校园订餐App设计
综合案例
【目标】
下面搞定主界面中 关于账单部分的内容,这与活动界面部分基本一致,只是涉及到的实体不同。账单部分的数据必须登录后才能看见,这还需要准备一个登录对话框。
1、账单Activity对应类是AccountActivity类,代码如下,注意它也继承了ActivityGroup类。它的很多思路都与活动界面一样。【注意】未支付账单应该有个按钮,点击可以直接支付;历史账单只能查看详情。
public class AccountActivity extends ActivityGroup implements OnItemClickListener {
TabHost innerTab2;
//未付账单和历史账单
ListView paylist,payhistorylist;
List<Account> payData,payhistData;
EatApp app ;
AccountListAdapter payAdapter,payhistAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_account);
innerTab2=(TabHost) findViewById(R.id.innerTab_account);
paylist =(ListView) findViewById(R.id.innerTab_account_paylist);
payhistorylist=(ListView) findViewById(R.id.innerTab_account_payhistorylist);
app=(EatApp) getApplication();
if(app.userInfo==null){
Toast.makeText(this, "登录之后可以查看账单", Toast.LENGTH_LONG).show();
}else{
//初始化账单列表
initLv();
}
//初始化tab控件
initInnerTab2();
}
/**
* 初始化 未付账单和 历史账单 列表
*/
private void initLv() {
EatDbHelper dbh=new EatDbHelper(this, "fooddb.db3", null, 1);
//处理未付账单数据
Account a =new Account();
a.setState(0);
payData=new AccountDao().queryAccountByState(dbh,app.userInfo, a);
payAdapter=new AccountListAdapter(this, R.layout.accountlist_item, payData);
paylist.setAdapter(payAdapter);
Log.i("Msg", "未付账单数 "+payData.size());
//处理已付账单数据
a.setState(1);
payhistData=new AccountDao().queryAccountByState(dbh, app.userInfo, a);
payhistAdapter=new AccountListAdapter(this, R.layout.accountlist_item, payhistData);
payhistorylist.setAdapter(payhistAdapter);
Log.i("Msg", "历史账单数 "+payhistData.size());
//添加监听器
paylist.setOnItemClickListener(this);
payhistorylist.setOnItemClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
Log.i("Msg", "AccountActivity onResume");
if(payhistAdapter!=null)
payhistAdapter.notifyDataSetChanged();
if(payAdapter!=null)
payAdapter.notifyDataSetChanged();
}
private void initInnerTab2() {
innerTab2.setup(getLocalActivityManager());
TabSpec t1=innerTab2.newTabSpec("inner_dis_t1");
t1.setIndicator("未付账单", getResources().getDrawable(R.drawable.ic_launcher));
t1.setContent(R.id.innerTab_accout_tab1);
TabSpec t2=innerTab2.newTabSpec("inner_dis_t2");
t2.setIndicator("历史账单", getResources().getDrawable(R.drawable.ic_launcher));
t2.setContent(R.id.innerTab_accout_tab2);
innerTab2.addTab(t1);
innerTab2.addTab(t2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.account, menu);
return true;
}
@Override
public void onItemClick(AdapterView<?> lv, View arg1, int arg2, long arg3) {
Intent intent=new Intent(AccountActivity.this,AccountDetailActivity.class);
Bundle bd =new Bundle();
if(lv.getId()==R.id.innerTab_account_paylist)
bd.putSerializable("account", payData.get(arg2));
else if(lv.getId()==R.id.innerTab_account_payhistorylist)
bd.putSerializable("account", payhistData.get(arg2));
intent.putExtras(bd);
startActivity(intent);
}
}
(1)这里再次用到 app=(EatApp) getApplication(); 这个EatApp究竟是个什么东西呢,下面马上说明。
(2)//
EatDbHelper dbh=new EatDbHelper(this, "fooddb.db3", null, 1);
//处理未付账单数据
Account a =new Account();
a.setState(0);
payData=new AccountDao().queryAccountByState(dbh,app.userInfo, a);
查询账单数据的方法依然 交由 db包中的 AccoutDao类实现。
(3)适配器依然是继承BaseAdapter 自定义的 。
payAdapter=new AccountListAdapter(this, R.layout.accountlist_item, payData);
(4)
点击账单项,可以调往具体详情 AccountDetailActivity.class 这个界面
public class EatApp extends Application {
//作为存储 购物车中订单项的 缓冲
public static List<AccountItem> orderItems=new ArrayList<AccountItem>();
//登录用户对象
public static UserInfo userInfo;
}
然后还要在配置文件修改:注意红色部分
<application
android:name="com.example.eatall.EatApp"
android:allowBackup="true"
android:icon="@drawable/logo_s"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
3、查询账单数据的类是AccoutDao,当然这个类不得能查询,还可以创建账单。
/**
* 处理订单对象
* @author Administrator
*
*/
public class AccountDao {
/**
* 根据指定 用户和 订单项数据,创建订单
* @param user 订单所有者
* @param items 订单项数据
* @return 成功返回创建好的订单对象
*/
public Account createAccount(EatDbHelper dbh,Account account){
SQLiteDatabase db=dbh.getWritableDatabase();
ContentValues cv =new ContentValues();
cv.put("userid", account.getUserId());
cv.put("state", account.getState());
cv.put("createDate", account.getCreateDate());
long id =db.insert("tb_account", null, cv);
account.set_id(String.valueOf(id));
return account;
}
public List<Account> queryAccountByState(EatDbHelper dbh,UserInfo user,Account ac){
List<Account> as=new ArrayList<Account>();
SQLiteDatabase db=dbh.getReadableDatabase();
Cursor c =db.query("tb_account", new String[]{"_id","userid","state","createDate"},
"state=? and userid=? ",new String[]{String.valueOf(ac.getState()),user.get_id()},
null,null,"createDate DESC");
if(c!=null){
c.moveToFirst();
while(!c.isAfterLast()){
Account a=new Account();
a.set_id(c.getString(0));
a.setUserId(c.getString(1));
a.setState(c.getInt(2));
a.setCreateDate(c.getString(3));
as.add(a);
c.moveToNext();
}
}
return as;
}
}
4、涉及到的账单实体是:
/**
* 账单类
* @author Administrator
*
*/
public class Account implements Serializable{
private String _id;
private String userId;
private int state; //订单状态,1:已付、0:未付、-1:取消
private String createDate; //账单生成日期
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
@Override
public String toString() {
return "Account [_id=" + _id + ", userId=" + userId + ", state="
+ state + ", createDate=" + createDate + "]";
}
}
5、查询到数据需要使用适配器填充, AccountListAdapter可以完成将数据 绑定到listView。
<span style="background-color: rgb(240, 240, 240);">/**
* 填充 账单列表的适配器
* @author Administrator
*/
public class AccountListAdapter extends BaseAdapter {
Context context;
int layout;
List<Account> as;
public AccountListAdapter(Context context, int layout, List<Account> as) {
super();
this.context = context;
this.layout = layout;
this.as = as;
}
@Override
public int getCount() {
return as.size();
}
@Override
public Object getItem(int arg0) {
return as.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int index, View item, ViewGroup arg2) {
//得到列表项所对应的 数据对象
Account ac=as.get(index);
View v=LayoutInflater.from(context).inflate(layout, null);
TextView id=(TextView) v.findViewById(R.id.accountlist_item_id);
id.setText(ac.get_id());
TextView date =(TextView) v.findViewById(R.id.accountlist_item_date);
date.setText(ac.getCreateDate());
</span><span style="background-color: rgb(255, 102, 102);">//未付账单和已付账单区别对待
if(ac.getState()==0){
ImageView iv =(ImageView) v.findViewById(R.id.accountlist_item_pay);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent=new Intent(context,PayActivity.class);
context.startActivity(intent);
}
});
}else{
ImageView iv =(ImageView) v.findViewById(R.id.accountlist_item_pay);
iv.setImageResource(R.drawable.haspay);
iv.setClickable(false);//不可点击
}</span><span style="background-color: rgb(240, 240, 240);">
return v;
}
}</span>
注意红色部分是为了区分未支付账单 和 已支付账单的,应为未支付账单上有个按钮,可以点击进行支付,历史账单上没有这个按钮。
6、账单列表 项的布局文件是:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:descendantFocusability="blocksDescendants"
android:padding="5dp">
<TextView
android:id="@+id/accountlist_item_idStr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="账单编号:" />
<TextView
android:id="@+id/accountlist_item_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/accountlist_item_idStr"
android:layout_alignBottom="@id/accountlist_item_idStr"
android:layout_marginLeft="5dp"
android:text="01" />
<TextView
android:id="@+id/accountlist_item_dateStr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/accountlist_item_id"
android:layout_alignBottom="@id/accountlist_item_idStr"
android:layout_marginLeft="5dp"
android:text="日期:" />
<TextView
android:id="@+id/accountlist_item_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/accountlist_item_dateStr"
android:layout_alignBottom="@id/accountlist_item_idStr"
android:layout_marginLeft="5dp"
android:text="2014-12-19" />
<ImageView
android:id="@+id/accountlist_item_pay"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignBottom="@id/accountlist_item_idStr"
android:layout_alignParentRight="true"
android:layout_marginRight="8dp"
android:src="@drawable/sale_01" />
</RelativeLayout>
7、登录后,可以看到的账单效果
点击支付后,使用一个假图 代替支付。
账单说完,下一篇说登录问题。