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

最近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=省 */
        }
    };

猜你喜欢

转载自blog.csdn.net/Lee465357793/article/details/53313891
今日推荐