暴走漫画系列之高仿淘宝收货地址(附demo)
引语: 我是个程序猿,一天我坐在路边一边喝水一边苦苦检查bug。 这时一个乞丐在我边上坐下了,开始要饭,我觉得可怜,就给了他1块钱。 然后接着调试程序。他可能生意不好,就无聊的看看我在干什么,然后过了一会,他缓缓地指着我的屏幕说,这里少了个分号…
谁说咱们程序猿不能写出既幽默又能懂的博客呢,本人想推出一系列博文,可以给刚接触Android开发的做一个参考,也可以与接触Android已久的各路大神比较一下,本人喜欢交流,如果有写得不好的地方,欢迎大家指出.如果有更好的效果或者功能,希望大家多多指点,互相学习可以共同进步.
说了这么多,现在进入今天的猪蹄,推出<<暴走漫画系列--高仿淘宝收货地址>>,有网购经验的同学应该对这个很熟悉,在淘宝的Android客户端里面,有一个功能是设置收货地址,不清楚的同学可以自己下载个淘宝客户端,自己添加一下看看.
本人一向喜欢贴图,这样有图有真相,才能说服每个人,废话不多说先上自己程序启动画面,然后运行界面,最后一张是淘宝客户端对照图.
图片震楼 启动界面 运行界面 淘宝界面
淘宝客户端无法录屏所以这里只能上静态的,大家可以自己打开淘宝客户端看看.
下面进行详细的代码讲解:
(一)本人在程序启动的时候开了一条后台服务landDivideServeice,目的是为了将全国的省市县总共4,189条数据插入到手机数据库里面去,原本的数据是保存在7个txt里面的,由于放在txt里面,读取操作很不方便,所以我把它放到数据库,在后面的地区筛选很快就出来,这个比淘宝还快哦,不信你们可以试一下.
这里要注意的一点是landDivideServeice是继承IntentService的,不是直接继承Service的.
IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。
简单的说IntentService类似于一条后台线程,但操作完成时,我们不用手动去关闭Serveice,他会自动关闭.MyIntentService继承IntentService,之后必须实现一个无参数的构造方法MyIntentService(),然后还要重写onHandleIntent(Intent intent);此后所有的后台操作即可在onHandleIntent(Intent intent)执行;
public class MyIntentService extends IntentService {//必须实现的public MyIntentService() {super("MyIntentService");// TODO Auto-generated constructor stub}@Overrideprotected void onHandleIntent(Intent arg0) {// TODO Auto-generated method stub//具体的操作}}
so ga...
IntentService详细解析:
http://blog.csdn.net/ryantang03/article/details/8146154
http://blog.csdn.net/flowingflying/article/details/7616333
(二)在程序启动的第一个activity里,我弄了一条倒计时线程,时间总共是20秒,目的是想为数据写入数据库争取多一些时间,如果你进入地址筛选界面,看到数据不全或者报错,是因为数据还没有写完.
实现倒计时功能主要是继承CountDownTimer类,重写onTick和onFinsh这两个方法,onFinish()中的代码是计时器结束的时候要做的事情;onTick(Long m)中的代码是你倒计时开始时要做的事情,构造方法TimeCount()中的两个参数中,前者是倒计的时间数,后者是倒计每秒中间 的间隔时间,都是以毫秒为单位.例如要倒计时30秒,每秒中间间隔时间是1秒,两个参数可以这样写TimeCount(20000,1000).
TimeCount time = new TimeCount(20000, 1000);
time.start();
/* 定义一个倒计时的内部类 */class TimeCount extends CountDownTimer {public TimeCount(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);}@Overridepublic void onFinish() { //倒计时执行结束时操作next = 0;}@Overridepublic void onTick(long millisUntilFinished) { //倒计执行时操作}}
(三)剩下的主要是一些界面的切换跟数据的读取,只要思路正确是不会被搞混的.
landDivideDB = LandDivideDB.getInstance(getBaseContext());List<LandDivide> landDivide = landDivideDB.queryAddress("superior=?", new String[]{"1"});Iterator<LandDivide> iterator = null;if(landDivide!=null){iterator = landDivide.iterator();while(iterator.hasNext()){LandDivide l = iterator.next();sheng.add(l.getName());}}else{return;}
mListView1.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) {// TODO Auto-generated method stubmLinearLayout1.setVisibility(View.GONE);mLinearLayout2.setVisibility(View.VISIBLE);mLinearLayout3.setVisibility(View.GONE);shi.clear();String name = sheng.get(position);String code = null;shengStr = name;shengTxt2.setText(name);List<LandDivide> landDivide = landDivideDB.queryAddress("name=?", new String[]{name});Iterator<LandDivide> iterator= landDivide.iterator();while(iterator.hasNext()){LandDivide l = iterator.next();code = l.getCode();break;}List<LandDivide> landDivide_2 = landDivideDB.queryAddress("superior=?", new String[]{code});Iterator<LandDivide> iterator_2= landDivide_2.iterator();while(iterator_2.hasNext()){LandDivide l = iterator_2.next();shi.add(l.getName());}shiAdapter.notifyDataSetChanged();quAdapter.clear();quAdapter.notifyDataSetChanged();}});mListView2.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) {// TODO Auto-generated method stubqu.clear();String name = shi.get(position);String code = null;shiStr = name;shengTxt3.setText(shengStr);shiTxt3.setText(name);List<LandDivide> landDivide = landDivideDB.queryAddress("name=?", new String[]{name});Iterator<LandDivide> iterator= landDivide.iterator();while(iterator.hasNext()){LandDivide l = iterator.next();code = l.getCode();break;}List<LandDivide> landDivide_2 = landDivideDB.queryAddress("superior=?", new String[]{code});if(landDivide_2!=null){Iterator<LandDivide> iterator_2= landDivide_2.iterator();while(iterator_2.hasNext()){LandDivide l = iterator_2.next();qu.add(l.getName());}}quAdapter.notifyDataSetChanged();if(qu.size()<1){mLinearLayout1.setVisibility(View.GONE);mLinearLayout2.setVisibility(View.VISIBLE);mLinearLayout3.setVisibility(View.GONE);Intent i = new Intent(AddressChoose.this,BuyAddress.class);i.putExtra("address", shengStr+","+shiStr);startActivity(i);finish();}else{mLinearLayout1.setVisibility(View.GONE);mLinearLayout2.setVisibility(View.GONE);mLinearLayout3.setVisibility(View.VISIBLE);mListView3.setVisibility(View.VISIBLE);topView3.setText("请选择 县区/其他...");}}});mListView3.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) {// TODO Auto-generated method stubString name = qu.get(position);quStr = name;Intent i2 = new Intent(AddressChoose.this,BuyAddress.class);i2.putExtra("address", shengStr+" "+shiStr+" "+quStr);startActivity(i2);finish();}});
(四)这个是选择好地址之后的界面,主要还是界面的转换跟焦点的获取
有时候setFocusable(true)跟setFocusableInTouchMode(true)并不能使控件获得焦点,要再之前加上一句requestFocus(),这样控件就可以获得焦点.
OnFocusChangeListener focusChanger = new OnFocusChangeListener() {@Overridepublic void onFocusChange(View v, boolean hasFocus) {// TODO Auto-generated method stubmyAddress.setStreet(jiequText.getText().toString());myAddress.setName(nameText.getText().toString());myAddress.setPhone(phoneText.getText().toString());switch (v.getId()) {case R.id.my_set_buyaddress_jiequ:if (!hasFocus && myAddress.getStreet().length() > 0) {jiequText.setVisibility(View.GONE);jiequLinear.setVisibility(View.VISIBLE);jiequTextView.setText(myAddress.getStreet());}if (hasFocus) {jiequText.setSelectAllOnFocus(true);}break;case R.id.my_set_buyaddress_name:if (!hasFocus && myAddress.getName().length() > 0) {nameText.setVisibility(View.GONE);nameLinear.setVisibility(View.VISIBLE);nameTextView.setText(myAddress.getName());}if (hasFocus) {nameText.setSelectAllOnFocus(true);}break;case R.id.my_set_buyaddress_phone:if (!hasFocus && myAddress.getPhone().length() > 0) {phoneText.setVisibility(View.GONE);phoneLinear.setVisibility(View.VISIBLE);phoneTextView.setText(myAddress.getPhone());}if (hasFocus) {phoneText.setSelectAllOnFocus(true);}break;default:break;}}};OnClickListener click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.my_set_buyaddress_sheng_linear:Intent i = new Intent(BuyAddress.this, AddressChoose.class);i.putExtra("Boolean", "aaa");startActivity(i);break;case R.id.my_set_buyaddress_jiequ_linear:jiequText.setVisibility(View.VISIBLE);jiequLinear.setVisibility(View.GONE);jiequText.setFocusable(true);jiequText.setFocusableInTouchMode(true);jiequText.requestFocus();break;case R.id.my_set_buyaddress_name_linear:nameText.setVisibility(View.VISIBLE);nameLinear.setVisibility(View.GONE);nameText.setFocusable(true);nameText.setFocusableInTouchMode(true);nameText.requestFocus();break;case R.id.my_set_buyaddress_phone_linear:phoneText.setVisibility(View.VISIBLE);phoneLinear.setVisibility(View.GONE);phoneText.setFocusable(true);phoneText.setFocusableInTouchMode(true);phoneText.requestFocus();break;case R.id.my_set_buyaddress_address_btn:myAddress.setStreet(jiequText.getText().toString());myAddress.setName(nameText.getText().toString());myAddress.setPhone(phoneText.getText().toString());if (myAddress.getPhone().length() > 0) {phoneText.setVisibility(View.GONE);phoneLinear.setVisibility(View.VISIBLE);phoneTextView.setText(myAddress.getPhone());}postBtn.requestFocus();postBtn.setFocusable(true);postBtn.setFocusableInTouchMode(true);if (myAddress.getProvinces().length() < 1 || myAddress.getStreet().length() < 1|| myAddress.getName().length() < 1 || myAddress.getPhone().length() < 1) {Toast.makeText(getBaseContext(), "请完整填写收货人资料", 0).show();return;}myAddress.setStatus(checkBox.isChecked());AddressDB addressDB = AddressDB.getInstance(getBaseContext());if(checkBox.isChecked()){List<AddressInfo> list = addressDB.queryAddress();if(list!=null){Iterator<AddressInfo> iterator = list.iterator();while(iterator.hasNext()){AddressInfo a = iterator.next();a.setStatus(false);addressDB.updeteAddress(a);}}}if (addressinfo != null) {if(addressDB.updeteAddress(myAddress)){Toast.makeText(getBaseContext(), "修改收货地址成功", Toast.LENGTH_LONG).show();}else{Toast.makeText(getBaseContext(), "修改收货地址失败", Toast.LENGTH_LONG).show();}} else {SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");Date date = new Date();String id = format.format(date);myAddress.setId(id);if(addressDB.insertAddress(myAddress)){Toast.makeText(getBaseContext(), "添加收货地址成功", Toast.LENGTH_LONG).show();}else{Toast.makeText(getBaseContext(), "添加收货地址失败", Toast.LENGTH_LONG).show();}}Intent intent = new Intent(BuyAddress.this, PersonAddress.class);startActivity(intent);finish();break;case R.id.download_layout1:finish();break;default:break;}}};
小弟不才,参加了CSDN的博客大赛,在这里想请各位帮个忙,投下您尊贵的一票,您说都看到这里了,是不是,底下就是投票的位置了,就顺便投一下嘛(如果底下没有投一票的按钮,请点击下面的链接,进入投票页面,拉到页面底下即可投票).
投票地址:http://vote.blog.csdn.net/Article/Details?articleid=32936187
源码地址: http://download.csdn.net/detail/chillax_li/7531409
尊重原创,转载请注明出处:http://blog.csdn.net/chillax_li/article/details/32936187
转载于:https://www.cnblogs.com/Chillax-KUN/p/3841303.html
暴走漫画系列之高仿淘宝收货地址(附demo)相关推荐
- 高仿淘宝分页:jQuery分页插件kkpager-Array-专题视频课程
高仿淘宝分页:jQuery分页插件kkpager-503人已学习 课程介绍 天底下万能的分页 课程收益 让所有人不再为分页所苦恼 讲师介绍 Array 更多讲师课程 ...
- 微信小程序 三级分类(高仿淘宝页面分类)
** 三级分类(高仿淘宝页面分类) ** 初步的二级页面参考的这个文章的代码:https://blog.csdn.net/luowei85520/article/details/90510311 这个 ...
- 高仿淘宝和聚美优品商城详情页实现《IT蓝豹》
高仿淘宝和聚美优品商城详情页实现 android-vertical-slide-view高仿淘宝和聚美优品商城详情页实现,在商品详情页,向上拖动时,可以加载下一页. 使用ViewDragHelper, ...
- 伯乐发卡系统高级版源码 高仿淘宝模板 带用户中心
介绍: 内置高仿淘宝模板,带用户中心 分销代理等等 推荐使用宝塔面板安装,设置运行目录为public,测试环境为php7.0 mysql5.5 伪静态选择为thinkphp 授权已经去了,后台是/h ...
- android版高仿淘宝客户端源码V2.3
android版高仿淘宝客户端源码V2.3,这个版本我已经更新到2.3了,源码也上传到源码天堂那里了,大家可以看一下吧,该应用实现了我们常用的购物功能了,也就是在手机上进行网购的流程的,如查看产品(浏 ...
- H5高仿淘宝(html模板)
[实例截图] [核心代码] H5仿淘宝移动端大型综合购物商城app模板 ├── car.html ├── class.html ├── find.html ├── index.html ├── my- ...
- Android仿京东收货地址
Android仿京东三级联动收货地址 1.在本地新建assets目录,存放三级联动json数据,取本地json数据作为数据源 String data = com.miles.zcstc.fingerd ...
- Android 毕业设计高仿新浪微博客户端(内附源码)
高仿新浪微博客户端 一款独立开发的第三方新浪微博客户端,在还原了官方微博的UI的同时,加入更多不同于官方微博的新特性,给用户带来更加流畅,没有广告的体验,现在任意用户均可以登录微博进行体验 快速下载体 ...
- 短链接java代码_java高仿新浪微博短链接地址生成工具ShortUrlGenerator.java
仿新浪微博 短链接地址生成工具 ShortUrlGenerator.java String sLongUrl = "http://tech.sina.com.cn/i/2011-03-23/ ...
- java 新浪短链接_java高仿新浪微博短链接地址生成工具ShortUrlGenerator.java | 学步园...
仿新浪微博 短链接地址生成工具 ShortUrlGenerator.java String sLongUrl = "http://www.zuidaima.com/share/1550463 ...
最新文章
- 《algorithm-note》算法笔记中文版正式发布!
- autowired 静态方法使用_关于springboot工具类中@Autowired注入bean,用static直接修饰,静态方法使用bean时报空指针异常错误...
- mysql5.6视频_网易视频云:MySQL 5.6 5.7最优配置文件模板
- [折半搜索][has] Jzoj P4250 路径
- 如何简单有效地实现迁移学习?ECCV 2020 论文介绍
- 简单的选项卡功能实现
- 能源感知型云计算的快速摘要
- 两种改变 Windows Vista UI语言的途径
- VSF表格 粘贴板ClipBoard 将数据粘贴到表格 VB6.0
- 推荐一款限时下载应用(听心字典)
- Struts2(Maven),小白版
- MySQL创建商品入库和出库后库存更新的触发器
- linux中不用命令安装flash,Linux下安装flash player的方法
- 蛋白质组学数据分析——(1)原理
- Axapta multi records selected and operated:多行操作
- 2018——广东工业大学校赛题解
- 机器人兴趣班奖状_美术兴趣班奖状称号
- SAP ERP统驭科目
- 史上最全软件测试工程师常见的面试题总结【杭州多测师】【面试题】【杭州多测师_王sir】...
- (超简单)ESP8266深度睡眠模式下远程采集温湿度信息