仿淘宝收货地址,本地数据库

谁说咱们攻城狮不能写出既幽默又能懂的博客呢,本人想推出一系列博文,可以给刚接触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 
    }  
 
 @Override 
 protected 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);  
        }  
 
 @Override 
 public void onFinish() {  //倒计时执行结束时操作 
            next = 0;  
        }  
 
 @Override 
 public 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() {  
 
 @Override 
 public void onItemClick(AdapterView<?> arg0, View arg1, int position,  
 long arg3) {  
 // TODO Auto-generated method stub 
                mLinearLayout1.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() {  
 
 @Override 
 public void onItemClick(AdapterView<?> arg0, View arg1, int position,  
 long arg3) {  
 // TODO Auto-generated method stub 
 
                qu.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() {  
 
 @Override 
 public void onItemClick(AdapterView<?> arg0, View arg1, int position,  
 long arg3) {  
 // TODO Auto-generated method stub 
 
                String 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() {  
 
 @Override 
 public void onFocusChange(View v, boolean hasFocus) {  
 // TODO Auto-generated method stub 
            myAddress.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() {  
 
 @Override 
 public void onClick(View v) {  
 // TODO Auto-generated method stub 
 switch (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,看一下哦。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏androidBlog

Android 自定义 MarqueeView 实现跑马灯 —— 原理篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

1801
来自专栏Android中高级开发

Android开发之漫漫长途 XV——RecyclerView

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

1852
来自专栏Android开发经验

常用的代码片段,不断更新

1482
来自专栏Android开发指南

3.CursorAdapter

39915
来自专栏移动端开发

Android学习--RecyclerView

       前面一篇总结了ListView,在这篇我们总结一些这个RecyclerView,我们就从最基本的开始,安卓团队是将RecyclerView定义在s...

23410
来自专栏向治洪

介绍几个好用的android自定义控件

首先看效果图, ? 看下这两个界面,第一个中用到了一个自定义的FlowRadioGroup,支持复合子控件,自定义布局; 第二个界面中看到了输入的数字 自...

3177
来自专栏Android中高级开发

Android开发之漫漫长途 Fragment番外篇——TabLayout+ViewPager+Fragment

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

2431
来自专栏酷玩时刻

Retrofit2+Rxjava+MVP 实践

此博文根据前面两篇文章 Android MVP 架构初试 Android MVP 架构封装 再结合主流框架Retrofit2+Rxjava来个实践(实现聚合网...

3674
来自专栏向治洪

ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示

正常情况下, ViewPager 一页只能显示一项数据, 但是我们常常看到网上,特别是电视机顶盒的首页经常出现中间大图显示两端也都露出一点来,这种效果怎么实现呢...

7375
来自专栏分享达人秀

完善RecyclerView,添加首尾视图

在之前学习ListView的时候,有学习过如何给ListView添加列表头和列表尾。但是通过近几期的学习,发现RecyclerView是一个比ListV...

2448

扫码关注云+社区

领取腾讯云代金券