Android 仿淘宝2017添加地址

最近想做个商城仿淘宝收货地址选择,在网上搜索“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 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张图片



你可能感兴趣的:(Android,Android商城)