最近想做个商城仿淘宝收货地址选择,在网上搜索“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'
这里引用的时候要注意写上下面两句,避免冲突。
项目的导包跟目录如下图: