利用ViewPage实现-->三级地址列表展 --><贡献服务端源码>

来源:互联网 发布:mac上的办公软件有哪些 编辑:程序博客网 时间:2024/05/14 14:04

最近ViewPager写多了。看到某宝的地址选择界面,不由得就有了使用ViewPager展示地址列表的想法来。

  • 完成了基本功能,自己简单封装了HttpUrlConnection进行网络访问,项目运用请使用改用三方工具
  • 自己写的服务器,请求字段的要求参考压缩包文档,(不建议修改字段,否则改动较大,不如自己写)
  • 暂时没有发现严重BUG. 都是用些基础的东西,想要更炫的效果,可以自己包装下

三方资源: LazyViewPager 、GSON

注意:本地资源并不全面,只供展示界面效果。

设计思想:

  1. 当全部地址列表页面展示出来后,再次点击销毁 ‘ 区 ’ 界面,杜绝地址信息不匹配的BUG

  2. 使用LazyViewPager 懒加载功能,解决界面销毁,缓存遗留,滑动可见BUG

效果图:

这里写图片描述


布局比较简单,就不贴源码了。 由于复用了列表展示的page页面,逻辑上处理有些麻烦。解析的bean对象也是复用的,限制了服务端的字段类型。

  • 下面是指示线的位移逻辑,以及页面改变时修改TYPE(地址类型)。
  • 通过ViewPager.OnPageChangeListener 实现。
/** * 界面改变事件监听 *  TYPE: 1=市, 2=区、县, other=省  */private LazyViewPager.OnPageChangeListener dealOnPagerChangeListener = new LazyViewPager.OnPageChangeListener() {    /** 滑动中 */    @Override    public void onPageScrolled(int position, float positionOffset            , int positionOffsetPixels) {        float disX = positionOffset * lineWidth;//获取滑动的距离        float startX = disX + position * lineWidth;//获取指示线起始位置        indicate_line.setTranslationX(startX);//设置位移动画    }    /** 当页面改变后 */    @Override    public void onPageSelected(int position) {        TYPE = position + 1;  //这里更改TYPE的值需要TYPE初值=1.否则将不能触发页面改变监听        int bule = getResources().getColor(R.color.colorPrimary);        int accent = getResources().getColor(R.color.colorAccent);        tv_province.setTextColor(position==0 ? accent : bule); //字体颜色选择        tv_city.setTextColor(position==1 ? accent : bule);        tv_area.setTextColor(position==2 ? accent : bule);    }    @Override    public void onPageScrollStateChanged(int state) {}};
  • 公用的解析方法。这是本地资源的解析方法,网络资源的解析,多加了响应结果字段的判断。 这个代码短些,就贴这个了
  • 本来也想把这部分抽出个公共方法的,无奈,脑细胞有限,尝试了几次并没什么进展,由于复用的bean,page页面。
//TODO 本地资源获取,联网可删除    private void insertAssets(final String fileName){        new Thread(){            @Override            public void run() {                try {                    InputStream inputStream = getAssets().open(fileName);                    final String stringFromStream = StreamUtils.getStringFromStream(inputStream);                    runOnUiThread(new Runnable() {                        @Override                        public void run() {                            parseAssetsJson(stringFromStream);                        }                    });                } catch (IOException e) {                    e.printStackTrace();                }            }        }.start();    }
  /**     * json解析本地     * @param json     *///TODO 本地资源获取,联网可删除    protected void parseAssetsJson(String json) {        try {                Gson gson = new Gson();  //解析                AreaJsonBean address = gson.fromJson(json, AreaJsonBean.class);//分割线>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                if(address.province != null){  //加载 省列表Fragment                    ArrayList<AddressArea> provinces = address.province;                    Log.e("province====", provinces.toString());                    if(pagers.size() == 0){                        pagers.add(mProvince);                    }else {                        mProvince = pagers.get(0);                    }                    mProvince.setData(provinces);//设置数据                    initLineWidth();//刷新viewPager适配器                    mProvince.setOnItemClick(dealOnItemClickLdistener);                    area_viewpager.setCurrentItem(0);                }//分割线>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                if(address.city != null){  //加载市列表Fragment                    ArrayList<AddressArea> citys = address.city;                    if(pagers.size() == 1){                        pagers.add(mCity);                    }else{                        mCity = pagers.get(1);                    }                    mCity.setData(citys); //设置数据                    initLineWidth();//刷新viewPager适配器                    mCity.setOnItemClick(dealOnItemClickLdistener);                    area_viewpager.setCurrentItem(1);                }//分割线>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                if(address.area != null){                    ArrayList<AreaJsonBean.AddressArea> aeras = address.area;                    if(pagers.size() == 2){                        pagers.add(mArea);                    }else{                        mArea = pagers.get(2);                    }                    mArea.setData(aeras); //填充数据                    initLineWidth();//刷新viewPager适配器                    mArea.setOnItemClick(dealOnItemClickLdistener);                    area_viewpager.setCurrentItem(2);                }        } catch (Exception e) {            e.printStackTrace();        }    }
  • 自己重定义的OnItemClickLestener 方便获取条目信息,记录信息是根据请求类型分别记录 省 市 区
    /**     * 处理地址列表条目点击事件     */    private AreaPager.DealOnItemClickListener dealOnItemClickLdistener = new AreaPager.DealOnItemClickListener() {        @Override        public void dealOnItemClickListener(List areaList, int position) {            AddressArea addressArea = (AddressArea) areaList.get(position);            switchRecord(addressArea); //选择记录地址信息//            requestNet(addressArea.areaID);  //开启子线程,获取网络数据 //TODO 联网开启            /** TYPE: 1=市, 2=区、县, other=省 */        }    };
  • 资源包
    附上资源:http://download.csdn.net/detail/lee465357793/9687041

  • android:
    GitHub:https://github.com/Lee465357793/AddressDemo

0 0
原创粉丝点击