Android仿京东三级联动收货地址
1.在本地新建assets目录,存放三级联动json数据,取本地json数据作为数据源
String data = com.miles.zcstc.fingerdemo.JsonParser.getJson(context, "city.json");
JsonParser jsonParser = new JsonParser();
JsonArray jsonElements = jsonParser.parse(data).getAsJsonArray();//获取JsonArray对象
2.popupwindow弹窗
/**
* 作者:Allen
* 时间:2019/11/12 14:27
* 描述:仿京东城市选择器
*/
public class JDCityPicker extends PopupWindow {
View view;
Context mContext;
RecyclerView mRvProvince;
RecyclerView mRvCity;
RecyclerView mRvArea;
ArrayList<CityInfoBean> beans;
List<String> provinceList = new ArrayList<>();
List<String> cityList = new ArrayList<>();
List<String> areaList = new ArrayList<>();
ProvinceAdapter mProvinceAdapter;
CityAdapter mCityAdapter;
AreaAdapter mAreaAdapter;
String province, city, area;
CityInfoBean mCityInfoBean;
TextView mTvProvince;
TextView mTvCity;
TextView mTvArea;
ImageView mImgClose;
LinearLayout mLlSelect;
onCitySelect citySelect;
public JDCityPicker(Context context, onCitySelect citySelect) {
super(context);
this.mContext = context;
this.citySelect = citySelect;
init(context);
}
private void init(Context context) {
view = LayoutInflater.from(context).inflate(R.layout.dialog_city_picker, null);
mRvProvince = view.findViewById(R.id.rv_province);
mRvCity = view.findViewById(R.id.rv_city);
mRvArea = view.findViewById(R.id.rv_area);
mTvProvince = view.findViewById(R.id.tv_province);
mTvCity = view.findViewById(R.id.tv_city);
mTvArea = view.findViewById(R.id.tv_area);
mLlSelect = view.findViewById(R.id.ll_select);
mImgClose = view.findViewById(R.id.img_close);
this.setContentView(view);
this.setBackgroundDrawable(new BitmapDrawable());
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
int height = (int) (wm.getDefaultDisplay().getHeight() * 0.8);
this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
this.setHeight(height);
this.setFocusable(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
this.setClippingEnabled(false);
this.setOutsideTouchable(false);
}
this.setAnimationStyle(R.style.PopupWindow);
String data = com.miles.zcstc.fingerdemo.JsonParser.getJson(context, "city.json");
JsonParser jsonParser = new JsonParser();
JsonArray jsonElements = jsonParser.parse(data).getAsJsonArray();//获取JsonArray对象
beans = new ArrayList<>();
Gson gson = new Gson();
for (JsonElement bean : jsonElements) {
CityInfoBean bean1 = gson.fromJson(bean, CityInfoBean.class);//解析
beans.add(bean1);
}
initData(beans);
mImgClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
mTvProvince.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
province = "";
city = "";
mTvCity.setVisibility(View.GONE);
mTvProvince.setVisibility(View.GONE);
mLlSelect.setVisibility(View.VISIBLE);
mRvProvince.setVisibility(View.VISIBLE);
mRvCity.setVisibility(View.GONE);
mRvArea.setVisibility(View.GONE);
cityList.clear();
}
});
mTvCity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
city = "";
mTvCity.setVisibility(View.GONE);
areaList.clear();
// initCity();
mRvProvince.setVisibility(View.GONE);
mRvCity.setVisibility(View.VISIBLE);
mRvArea.setVisibility(View.GONE);
}
});
/* mTvArea.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initArea();
}
});*/
}
private void initData(ArrayList<CityInfoBean> beans) {
for (int i = 0; i < beans.size(); i++) {
provinceList.add(beans.get(i).getName());
}
initProvince();
}
private void initProvince() {
mRvProvince.setVisibility(View.VISIBLE);
mRvCity.setVisibility(View.GONE);
mRvArea.setVisibility(View.GONE);
mProvinceAdapter = new ProvinceAdapter(provinceList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
mRvProvince.setLayoutManager(linearLayoutManager);
mRvProvince.setAdapter(mProvinceAdapter);
mProvinceAdapter.setOnItemListener(new ProvinceAdapter.onItemClick() {
@Override
public void onClick(int position, String name) {
mProvinceAdapter.setSelection(position);
mProvinceAdapter.notifyDataSetChanged();
if (TextUtils.isEmpty(province)) {
province = name;
mTvProvince.setVisibility(View.VISIBLE);
mTvProvince.setText(name);
initCity();
}
mCityInfoBean = beans.get(position);
for (int i = 0; i < mCityInfoBean.getCity().size(); i++) {
cityList.add(mCityInfoBean.getCity().get(i).getName());
}
}
});
mProvinceAdapter.notifyDataSetChanged();
}
private void initCity() {
mRvProvince.setVisibility(View.GONE);
mRvCity.setVisibility(View.VISIBLE);
mRvArea.setVisibility(View.GONE);
mCityAdapter = new CityAdapter(cityList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
mRvCity.setLayoutManager(linearLayoutManager);
mRvCity.setAdapter(mCityAdapter);
mCityAdapter.setOnItemListener(new CityAdapter.onItemClick() {
@Override
public void onClick(int position, String name) {
if (TextUtils.isEmpty(city)) {
city = name;
mTvCity.setVisibility(View.VISIBLE);
mTvCity.setText(city);
}
areaList = mCityInfoBean.getCity().get(position).getArea();
initArea();
}
});
}
private void initArea() {
mRvProvince.setVisibility(View.GONE);
mRvCity.setVisibility(View.GONE);
mRvArea.setVisibility(View.VISIBLE);
mAreaAdapter = new AreaAdapter(areaList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
mRvArea.setLayoutManager(linearLayoutManager);
mRvArea.setAdapter(mAreaAdapter);
mAreaAdapter.setOnItemListener(new AreaAdapter.onItemClick() {
@Override
public void onClick(int position, String name) {
if (TextUtils.isEmpty(area)) {
area = name;
mTvArea.setVisibility(View.VISIBLE);
mTvArea.setText(area);
mLlSelect.setVisibility(View.GONE);
citySelect.onSelect(province, city, area);
dismiss();
}
}
});
}
public interface onCitySelect {
void onSelect(String province, String city, String area);
}
}
3.在activity里调用
package com.miles.zcstc.fingerdemo;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
TextView mTvSlect;
TextView mTvCity;
JDCityPicker mJDCityPicker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvSlect = findViewById(R.id.tv_select);
mTvCity = findViewById(R.id.tv_city_pick);
mTvSlect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bgAlpha(0.7f);
mJDCityPicker = new JDCityPicker(MainActivity.this, new JDCityPicker.onCitySelect() {
@Override
public void onSelect(String province, String city, String area) {
mTvCity.setText(province + " " + city + " " + area);
}
});
mJDCityPicker.showAtLocation(mTvSlect, Gravity.BOTTOM, 0, 0);
mJDCityPicker.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
bgAlpha(1.0f);
}
});
}
});
}
//背景变暗
private void bgAlpha(float f) {
WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
layoutParams.alpha = f;
getWindow().setAttributes(layoutParams);
}
}
代码在git上,有不明白的,看一下源码
git地址