Android 仿淘宝2017添加地址
16lz
2021-01-23
最近想做个商城仿淘宝收货地址选择,在网上搜索“android 淘宝收货地址”,就看到了想要的效果。
文章写的不错,可惜菜鸟级的我很多看不懂,所以用例外一种方式实现了。
这里用到的数据时之前在做腾讯地图用到的接口,先附上效果图:
源码下载
这里的源码下载的是一个module,需要导入到自己项目中才可以用。
使用步骤如下:
导入成功之后,选择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 保存联系人,包括部门\职位\传真\地址\照片
- Android - 原生登录注册页面【仿】淘宝App
- android-ndk-r10d r13b下载地址
- android 9.0获取mac地址的方法
- Android 获取mac地址方法
- Android 使用 Scheme 启动淘宝,天猫等其他APP
- Android webview中定制js的alert,confirm和prompt对话框的方法 (
- android studio开发环境配置(指定SDK及卸载)附安装文件网盘地址(win
- Android GPS 定位 2 详细地址