首先第一步,一个点餐app,最先进入的就是打开时候的封面跳转界面了,因此,我们先来设计这个跳转界面:JumpActivity,
我们先设计好与之相对的xml,然后去JumpActivity里写逻辑,一些控件初始化等等就不讲了,但这里有一个双线程的操作,既要经过一定的时间,页面会自动跳转,也要具备,点击"跳过按钮",页面会手动跳转,这里需要用到Handler,先初始化一个Handler,然后初始化Runnable在run()方法中进行跳转到LoginActivity,也需要在Oncreate()方法中设置postDelayed()方法,制定延迟时间,同时也需要设置button的点击事件,进行跳转操作,跳转之前可以先
Handler.removeCallbacks(Runnable);
来取消postDelayed的方法里面的runnable,还有一个很重要的就是AndroidManifest.xml中将主Activity进行修改,换成JumpActivity。
下一步,我们就进入LoginActivity了,第一步肯定也是XML的Preview设计,不多说,来个RelativeLayout,整个4行,分别是:请输入账户,请输入密码,确定,注册。之后就是到LoginAtivity中,首先先控件初始化,然后需要设置点击事件,setOnClickListener,在点击事件前,也需要initIntent() ,获取账户密码,之后需要设置登录按钮的点击事件,先获取输入的字符串:
String username = mEtUsername.getText().toString();
String password = mEtPassword.getText().toString();
再设置判断,避免为null,再调用一个网络数据获取的类,其中传入参数:账户,密码,callback,在成功和失败的方法中写上需要的操作,同时,注册的话,设置跳转操作,到RegisterActivity,在注册操作和登录类似,
mBtnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String username = mEtUsername.getText().toString();
String password = mEtPassword.getText().toString();
String repassword = mEtRePassword.getText().toString();
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
T.showToast("账号或者密码不能为空");
return;
}
if (!password.equals(repassword)) {
T.showToast("两次输入密码不一致");
return;
}
startLoadingProgress();
mUserBiz.register(username, password, new CommonCallback<User>() {
@Override
public void onError(Exception e) {
T.showToast(e.getMessage());
Log.d("ee", e.getMessage());
stopLoadingProgress();
}
@Override
public void onSuccess(User user) {
stopLoadingProgress();
T.showToast("注册成功,用户名为:" + user.getUsername());
LoginActivity.launch(RegisterActivity.this,
user.getUsername(), user.getPassword());
finish();
}
});
之后便设置点餐的个人详情页面OrderActivity,设置自己需要的点餐主界面,带有自己头像和名字,已经点过的记录,可点击每条记录,进行页面跳转,可以查看具体的点餐信息(这个界面之后再说),这么界面下面的点击记录就需要用到recyclerview,设置item,也需要设置需要的item.xml,同时你需要设置上滑和下滑的功能,设置加载监听,
//设置开关
mRefreshLayout.setMode(SwipeRefresh.Mode.BOTH);
//设置颜色
mRefreshLayout.setColorSchemeColors(Color.RED, Color.BLACK, Color.BLUE, Color.GRAY);
mRefreshLayout.setOnRefreshListener(new SwipeRefresh.OnRefreshListener() {
@Override
public void onRefresh() {
loadData();
}
});
mRefreshLayout.setOnPullUpRefreshListener(new SwipeRefreshLayout.OnPullUpRefreshListener() {
@Override
public void onPullUpRefresh() {
loadMore();
}
});
一个是上拉刷新数据,另一个是下拉刷新更多记录,
private void loadMore() {
mOrderBiz.listByPage(++mCurrentPage, new CommonCallback<List<Order>>() {
@Override
public void onError(Exception e) {
stopLoadingProgress();
T.showToast(e.getMessage());
mRefreshLayout.setPullUpRefreshing(false);
mCurrentPage--;
String message = e.getMessage();
if (message.contains("用户未登录")) {
toLoginActivity();
}
}
@Override
public void onSuccess(List<Order> response) {
stopLoadingProgress();
if (response.size() == 0) {
T.showToast("木有历史订单啦~~~");
mRefreshLayout.setPullUpRefreshing(false);
return;
}
T.showToast("更新订单成功~~~");
mDatas.addAll(response);
mAdapter.notifyDataSetChanged();
mRefreshLayout.setPullUpRefreshing(false);
}
});
}
private void loadData() {
mOrderBiz.listByPage(0, new CommonCallback<List<Order>>() {
@Override
public void onError(Exception e) {
stopLoadingProgress();
T.showToast(e.getMessage());
if (mRefreshLayout.isRefreshing()) {
mRefreshLayout.setRefreshing(false);
}
if (e.getMessage().contains("用户未登录")) {
toLoginActivity();
}
}
@Override
public void onSuccess(List<Order> response) {
stopLoadingProgress();
T.showToast("更新订单成功~~~");
mDatas.clear();
mDatas.addAll(response);
mAdapter.notifyDataSetChanged();
if (mRefreshLayout.isRefreshing()) {
mRefreshLayout.setRefreshing(false);
}
}
});
}
其中CommonCallback<List>()是点餐列表的回调数据,分别写了成功和失败的效果,其次便是recyclerview设置适配器,和加载图片
mAdapter = new OrderAdapter(this, mDatas);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mAdapter);
Picasso.with(this).load(R.drawable.icon).placeholder(R.drawable.pictures_no).transform(new CircleTransform()).into(mIvIcon);
有一个挺好的方法就是onKeyDown可以每次关闭app,再次打开,不用重新输入密码,会自动跳到这个activity
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Intent home = new Intent(Intent.ACTION_MAIN);
home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
home.addCategory(Intent.CATEGORY_HOME);
startActivity(home);
return true;
}
return super.onKeyDown(keyCode, event);
}
之后可以设置下,刚刚上面提到的查看点餐记录细节的activity:OrderdetailActivity,在这里,你只需要图片的加载,文本和一些数据的打印就行。
再者,你需要进入到点餐的界面ProductListActivity,通常是一个toolbar返回,加上recyclerview,最下面是结账的一个LInearLayout,通常是一半显示数量,一半显示支付和价钱。而activity里面的方法和Orderdetailacitvity类似,并且具体的ProductDeatilActivity也是和点餐主界面的Detail界面类似,这些经过修改可以套用,我认为最大的区别以及最重要的是数据直接的传递回调和复用等等,接下来就讲讲Order和Product的界面的数据之间的关系。
其中CommonCallback是自己写的一个回调接口,用于数据的回调,接收,数据的转化。
Order是用来存放一些方法,get(),set()和一些获取数据的方法,OerderBiz是Okhttp的网络操作,把对应URl地址上的json数据获取到某些数列集合里,就是前面Order创建的容器。而OrderAdapter的recyclerview适配器,用来把Order里的数据填充进item里,而OerderDetailActivity和OrderActivity则是把数据显示出来。同理,Product,ProductBiz和ProductListActivity和ProductDetailActivity也同样如此。