引语: 我是个程序猿,一天我坐在路边一边喝水一边苦苦检查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;}}};
更多的代码解析,大家可以下载我的demo,看一下哦
最后就这样了哈,有什么不懂的或者更好的建议的,可以提出来哈,欢迎大家指教

小弟不才,参加了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)相关推荐

  1. 高仿淘宝分页:jQuery分页插件kkpager-Array-专题视频课程

    高仿淘宝分页:jQuery分页插件kkpager-503人已学习 课程介绍         天底下万能的分页 课程收益     让所有人不再为分页所苦恼 讲师介绍     Array 更多讲师课程   ...

  2. 微信小程序 三级分类(高仿淘宝页面分类)

    ** 三级分类(高仿淘宝页面分类) ** 初步的二级页面参考的这个文章的代码:https://blog.csdn.net/luowei85520/article/details/90510311 这个 ...

  3. 高仿淘宝和聚美优品商城详情页实现《IT蓝豹》

    高仿淘宝和聚美优品商城详情页实现 android-vertical-slide-view高仿淘宝和聚美优品商城详情页实现,在商品详情页,向上拖动时,可以加载下一页. 使用ViewDragHelper, ...

  4. 伯乐发卡系统高级版源码 高仿淘宝模板 带用户中心

    介绍: 内置高仿淘宝模板,带用户中心  分销代理等等 推荐使用宝塔面板安装,设置运行目录为public,测试环境为php7.0 mysql5.5 伪静态选择为thinkphp 授权已经去了,后台是/h ...

  5. android版高仿淘宝客户端源码V2.3

    android版高仿淘宝客户端源码V2.3,这个版本我已经更新到2.3了,源码也上传到源码天堂那里了,大家可以看一下吧,该应用实现了我们常用的购物功能了,也就是在手机上进行网购的流程的,如查看产品(浏 ...

  6. H5高仿淘宝(html模板)

    [实例截图] [核心代码] H5仿淘宝移动端大型综合购物商城app模板 ├── car.html ├── class.html ├── find.html ├── index.html ├── my- ...

  7. Android仿京东收货地址

    Android仿京东三级联动收货地址 1.在本地新建assets目录,存放三级联动json数据,取本地json数据作为数据源 String data = com.miles.zcstc.fingerd ...

  8. Android 毕业设计高仿新浪微博客户端(内附源码)

    高仿新浪微博客户端 一款独立开发的第三方新浪微博客户端,在还原了官方微博的UI的同时,加入更多不同于官方微博的新特性,给用户带来更加流畅,没有广告的体验,现在任意用户均可以登录微博进行体验 快速下载体 ...

  9. 短链接java代码_java高仿新浪微博短链接地址生成工具ShortUrlGenerator.java

    仿新浪微博 短链接地址生成工具 ShortUrlGenerator.java String sLongUrl = "http://tech.sina.com.cn/i/2011-03-23/ ...

  10. java 新浪短链接_java高仿新浪微博短链接地址生成工具ShortUrlGenerator.java | 学步园...

    仿新浪微博 短链接地址生成工具 ShortUrlGenerator.java String sLongUrl = "http://www.zuidaima.com/share/1550463 ...

最新文章

  1. 《algorithm-note》算法笔记中文版正式发布!
  2. autowired 静态方法使用_关于springboot工具类中@Autowired注入bean,用static直接修饰,静态方法使用bean时报空指针异常错误...
  3. mysql5.6视频_网易视频云:MySQL 5.6 5.7最优配置文件模板
  4. [折半搜索][has] Jzoj P4250 路径
  5. 如何简单有效地实现迁移学习?ECCV 2020 论文介绍
  6. 简单的选项卡功能实现
  7. 能源感知型云计算的快速摘要
  8. 两种改变 Windows Vista UI语言的途径
  9. VSF表格 粘贴板ClipBoard 将数据粘贴到表格 VB6.0
  10. 推荐一款限时下载应用(听心字典)
  11. Struts2(Maven),小白版
  12. MySQL创建商品入库和出库后库存更新的触发器
  13. linux中不用命令安装flash,Linux下安装flash player的方法
  14. 蛋白质组学数据分析——(1)原理
  15. Axapta multi records selected and operated:多行操作
  16. 2018——广东工业大学校赛题解
  17. 机器人兴趣班奖状_美术兴趣班奖状称号
  18. SAP ERP统驭科目
  19. 史上最全软件测试工程师常见的面试题总结【杭州多测师】【面试题】【杭州多测师_王sir】...
  20. (超简单)ESP8266深度睡眠模式下远程采集温湿度信息

热门文章

  1. 驱动人生官网服务器维护,驱动人生在线检测服务 驱动检测更新更加方便
  2. 豆瓣电影评论情感分析(含代码+数据)
  3. 城市道路5G智慧监控方案 让感知为安全护航
  4. 五种常用大数据分析方法
  5. python实现空气焓值,湿球温度的计算
  6. 【2017最新题库】通识课尔雅人文的物理学答案题库
  7. 方舟官方服务器怎么显示血量,方舟端游怎么显示血量
  8. Web前端开发工具和框架
  9. gliffy-confluence-plugin-9.1.2安装
  10. mysql安装和基本操作