最近想做个商城仿淘宝收货地址选择,在网上搜索“android 淘宝收货地址”,就看到了想要的效果。

文章写的不错,可惜菜鸟级的我很多看不懂,所以用例外一种方式实现了。

这里用到的数据时之前在做腾讯地图用到的接口,先附上效果图:

Android 仿淘宝2017添加地址_第1张图片


源码下载

 

这里的源码下载的是一个module,需要导入到自己项目中才可以用


使用步骤如下:

Android 仿淘宝2017添加地址_第2张图片


Android 仿淘宝2017添加地址_第3张图片


Android 仿淘宝2017添加地址_第4张图片


导入成功之后,选择tbareachoosedemo,然后运行他。


关键代码类:

1、AreaInfo.class 地区类

public class AreaInfo {    private String fullname; //地区名字    private int id; //地区编码    public String getFullname() {        return fullname;    }    public void setFullname(String fullname) {        this.fullname = fullname;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }}
2、ResultInfo.class  调用接口返回的数据类

public class ResultInfo {    private String message;    private int status;    private List result; //获取省份列表,上面两个可以不用理    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }    public int getStatus() {        return status;    }    public void setStatus(int status) {        this.status = status;    }    public List getResult() {        return result;    }    public void setResult(List result) {        this.result = result;    }}

3、AreaHttpUtils.class 获取地区网络加载类

public class AreaHttpUtils {    public final static String RESULT = "result";    public final static String AREACODE = "areacode";    public final static String AREA = "area";    public final static String PROVINCE = "province";    public final static String CITY = "city";    public final static String DISTRICT = "district";    private FragmentActivity mActivity;    private OnAreaListener mOnAreaListener;    private SweetAlertDialog mLoadingDialog;    public AreaHttpUtils(FragmentActivity activity) {        mActivity = activity;    }    /**     * 请求获取地区数据     * @param pDistrict 地区编码id     */    public void getDistrict(int pDistrict) {        TencentSearch tencentSearch = new TencentSearch(mActivity);        DistrictChildrenParam districtChildrenParam = new DistrictChildrenParam();        //如果不设置id,则获取全部数据        districtChildrenParam.id(pDistrict);        showProgressDialog("加载中...");        tencentSearch.getDistrictChildren(districtChildrenParam, new HttpResponseListener() {            @Override            public void onSuccess(int arg0, BaseObject arg1) {                // TODO Auto-generated method stub                if (arg1 == null) {                    return;                }                String result = new Gson().toJson(arg1);                mOnAreaListener.onSuccess(result);                dismissProgressDialog();            }            @Override            public void onFailure(int arg0, String arg1, Throwable arg2) {                // TODO Auto-generated method stub                mOnAreaListener.onFailure(arg1);                dismissProgressDialog();            }        });    }    /**     * 新建一个Fragment     * @param result 接口返回的数据     * @param area 数据是属于省份或者城市或区域     * @param fragmentId fragment的省份或者城市或区域 布局     */    public void newFragment(String result, String area, int fragmentId) {        FragmentManager fm = mActivity.getSupportFragmentManager();        Fragment fragment = fm.findFragmentById(fragmentId);        Bundle args = new Bundle();        args.putString(RESULT, result);        args.putString(AREA, area);        if (fragment == null) {            fragment = Fragment.instantiate(mActivity, AreaFragment.class.getName(), args);            fm.beginTransaction().add(fragmentId, fragment).commit();        }    }    public OnAreaListener getOnAreaListener() {        return mOnAreaListener;    }    public void setOnAreaListener(OnAreaListener mOnAreaListener) {        this.mOnAreaListener = mOnAreaListener;    }    public interface OnAreaListener {        void onSuccess(String result);        void onFailure(String arg1);    }    /**     * 显示sweetalertDialog加载框     * @param message 显示的信息     */    public void showProgressDialog(String message) {        mLoadingDialog = new SweetAlertDialog(mActivity, SweetAlertDialog.PROGRESS_TYPE);        mLoadingDialog.getProgressHelper().setBarColor(Color.parseColor("#A5DC86"));        mLoadingDialog.setTitleText(message);        mLoadingDialog.show();    }    public void dismissProgressDialog() {        if (mLoadingDialog != null || mLoadingDialog.isShowing()) {            mLoadingDialog.dismiss();        }    }}
4、AreaFragment.class 三页所公用的Fragment

public class AreaFragment extends Fragment implements AdapterView.OnItemClickListener {    private View mView;    private Bundle mArgs;    private ListView mListView;    private AreaAdapter mAdapter;    private List mInfos = new ArrayList<>();    private String sArea;    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        if (mView == null) {            mView = inflater.inflate(R.layout.fragment_area, container, false);            initViews();        } else if (mView.getParent() != null) {            ((ViewGroup) mView.getParent()).removeView(mView);        }        return mView;    }    private void initViews() {        mListView = (ListView) mView.findViewById(R.id.area_listview);        mAdapter = new AreaAdapter(getActivity());        mListView.setAdapter(mAdapter);        mListView.setOnItemClickListener(this);        setData();    }    private void setData() {        if (mArgs == null) {            mArgs = this.getArguments();            String result = mArgs.getString(AreaHttpUtils.RESULT);            sArea = mArgs.getString(AreaHttpUtils.AREA);            Gson gson = new Gson();            ResultInfo resultInfo = gson.fromJson(result, ResultInfo.class);            mInfos = resultInfo.getResult().get(0);            mAdapter.setList(mInfos);        }    }    @Override    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {        String area = mInfos.get(i).getFullname();        switch (sArea) {            case AreaHttpUtils.PROVINCE:                startActivity(AreaCityActivity.class, i);                AddressInfo.getInstance().setsProvince(area);                break;            case AreaHttpUtils.CITY:                startActivity(AreaDistrictActivity.class, i);                AddressInfo.getInstance().setsCity(area);                break;            case AreaHttpUtils.DISTRICT:                AddressInfo.getInstance().setsDistrict(area);                toAreaActivity();                break;        }    }    private void startActivity(Class<? extends FragmentActivity> cls, int position) {        Intent intent = new Intent(getActivity(), cls);        intent.putExtra(AreaHttpUtils.AREACODE, mInfos.get(position).getId());        getActivity().startActivity(intent);    }    private void toAreaActivity() {        Intent mIntent = new Intent(getActivity(), AreaActivity.class);        mIntent.putExtra("address", AddressInfo.getInstance().getAddress());        mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);        getActivity().startActivity(mIntent);    }}

5、BaseFragmentAcitivity.class   

用于让省份、城市、地区的三个Activity继承它,然后进行new上面的Fragment。以为这里的AreaFragment是公用的,只要Bundle进行传数据然后在AreaFragment中判断要生成那个Fragment

public class BaseFragmentActivity extends FragmentActivity {    private AreaHttpUtils mUtils;    private ImageView mImageView;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mImageView = (ImageView) findViewById(R.id.iv_back);        mImageView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                finish();            }        });    }    public void setAreaType(final String type) {        mUtils = new AreaHttpUtils(this);        mUtils.setOnAreaListener(new AreaHttpUtils.OnAreaListener() {            @Override            public void onSuccess(String result) {                setFragment(type, result);            }            @Override            public void onFailure(String arg1) {            }        });        Intent intent = this.getIntent();        if (intent != null) {            mUtils.getDistrict(intent.getIntExtra(AreaHttpUtils.AREACODE, 0));        }    }    private void setFragment(String type, String result) {        switch (type) {            case AreaHttpUtils.PROVINCE:                mUtils.newFragment(result, type, R.id.province_fragment);                break;            case AreaHttpUtils.CITY:                mUtils.newFragment(result, type, R.id.city_fragment);                break;            case AreaHttpUtils.DISTRICT:                mUtils.newFragment(result, type, R.id.district_fragment);                break;        }    }}

6、看到上面效果的listview拉下来的item跟滑效果么。其实他就是在Adapter 适配器中,

private int lastPosition;public View getView(int position, View convertView, ViewGroup parent) {if (lastPosition < position && lastPosition != 0) {             ObjectAnimator.ofFloat(convertView, "translationY", convertView.getHeight() * 2, 0).setDuration(500).start(); } lastPosition = position;}



在上面的项目中build.gradle中要记得引用

compile 'cn.pedant.sweetalert:library:1.3'
这里引用的时候要注意写上下面两句,避免冲突。

Android 仿淘宝2017添加地址_第5张图片


项目的导包跟目录如下图:

Android 仿淘宝2017添加地址_第6张图片



更多相关文章

  1. Android 保存联系人,包括部门\职位\传真\地址\照片
  2. Android - 原生登录注册页面【仿】淘宝App
  3. android-ndk-r10d r13b下载地址
  4. android 9.0获取mac地址的方法
  5. Android 获取mac地址方法
  6. Android 使用 Scheme 启动淘宝,天猫等其他APP
  7. Android webview中定制js的alert,confirm和prompt对话框的方法 (
  8. android studio开发环境配置(指定SDK及卸载)附安装文件网盘地址(win
  9. Android GPS 定位 2 详细地址

随机推荐

  1. Android基础之异步消息处理机制
  2. Android:开机自启动并接收推送消息
  3. 【Android】MVVM架构 RecyclerView加载数
  4. Android平台上从Camera的jpegquality菜单
  5. Android基础部分填坑
  6. Android连续点击多次(类似开发者模式)
  7. Android全屏解决方案
  8. Android应用程序消息处理机制(Looper、Han
  9. Android开发搭建环境
  10. 还在用 Windows 自带的搜索工具吗?你 out