Android基础知识【项目实训-实现二级导航“我的账单”及用户登录对话框】【6】

【该项目实训是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 这个界面


2、为了能够让多个Activity都能共用数据,因此本app使用了自定义的application类。代码如下:

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、登录后,可以看到的账单效果


点击支付后,使用一个假图 代替支付。


账单说完,下一篇说登录问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值