效果图//
public class AddRessSelection extends LinearLayout implements View.OnClickListener {
private Context context;
private List<String> province;
private List<String> citys;
private List<String> countys;
private View addressView;
private View dialog_line_province;
private View dialog_line_city;
private View dialog_line_district;
private TextView dialog_tv_province;
private TextView dialog_tv_city;
private TextView dialog_tv_district;
private RelativeLayout dialog_ll_province;
private RelativeLayout dialog_ll_city;
private RelativeLayout dialog_ll_district;
private ListView dialog_listView;
private AddRessListViewAdapter adapter;
public AddRessSelection(Context context) {
this(context, null);
}
public AddRessSelection(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public AddRessSelection(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
init();
}
/**
* 初始化可视化布局
*/
private void init() {
addressView = View.inflate(context, R.layout.address_selection_dialog, this);
initDialogView();
}
/**
* 初始化Dialog显示的控件
*/
private void initDialogView() {
//指示器
dialog_line_province = addressView.findViewById(R.id.dialog_line_province);
dialog_line_city = addressView.findViewById(R.id.dialog_line_city);
dialog_line_district = addressView.findViewById(R.id.dialog_line_district);
//选中地址显示
dialog_tv_province = addressView.findViewById(R.id.dialog_tv_province);
dialog_tv_city = addressView.findViewById(R.id.dialog_tv_city);
dialog_tv_district = addressView.findViewById(R.id.dialog_tv_district);
//指示器外框
dialog_ll_province = addressView.findViewById(R.id.dialog_ll_province);
dialog_ll_city = addressView.findViewById(R.id.dialog_ll_city);
dialog_ll_district = addressView.findViewById(R.id.dialog_ll_district);
dialog_listView = addressView.findViewById(R.id.dialog_lv_location_dialog);
initDialogClick();
}
/**
* 初始化Dialog中的点击事件
*/
private void initDialogClick() {
dialog_ll_province.setOnClickListener(this);
dialog_ll_city.setOnClickListener(this);
dialog_ll_district.setOnClickListener(this);
}
/**
* 设置省份数据源
*
* @param province
*/
public void setProvinceData(List<String> province) {
if (province == null) {
new NullPointerException("Data source is empty");
return;
}
setDialodLvAdapter(province);
this.province = province;
}
/**
* 设置市级数据源
*
* @param city
*/
public void setCityData(List<String> city) {
if (city == null) {
new NullPointerException("Data source is empty");
return;
}
this.citys = city;
}
/**
* 设置县级数据源
*
* @param county
*/
public void setCountyData(List<String> county) {
if (county == null) {
new NullPointerException("Data source is empty");
return;
}
this.countys = county;
}
@Override
public void onClick(View view) {
String dialogProvince = dialog_tv_province.getText().toString();
String dialogCity = dialog_tv_city.getText().toString();
switch (view.getId()) {
case R.id.dialog_ll_province:
dialog_tv_province.setText("选择省");
adapter = null;
setDialodLvAdapter(province);
dialog_line_province.setVisibility(VISIBLE);
dialog_line_city.setVisibility(INVISIBLE);
dialog_line_district.setVisibility(INVISIBLE);
dialog_tv_city.setText("选择市");
dialog_tv_district.setText("选择区县");
break;
case R.id.dialog_ll_city:
if (dialogProvince.equals("选择省") || dialogProvince == null) {
Toast.makeText(context, "请先选择省", Toast.LENGTH_SHORT).show();
return;
}
adapter = null;
setDialodLvAdapter(citys);
dialog_line_city.setVisibility(VISIBLE);
dialog_line_province.setVisibility(INVISIBLE);
dialog_line_district.setVisibility(INVISIBLE);
dialog_tv_district.setText("选择区县");
break;
case R.id.dialog_ll_district:
if (dialogProvince.equals("选择省") || dialogProvince == null) {
Toast.makeText(context, "请先选择省", Toast.LENGTH_SHORT).show();
return;
}
if (dialogCity.equals("选择市") || dialogCity == null) {
Toast.makeText(context, "请先选择市", Toast.LENGTH_SHORT).show();
return;
}
adapter = null;
setDialodLvAdapter(countys);
dialog_line_district.setVisibility(VISIBLE);
dialog_line_city.setVisibility(INVISIBLE);
dialog_line_province.setVisibility(INVISIBLE);
break;
}
}
/**
* 设置Dialog listview 适配器
*
* @param data
*/
private void setDialodLvAdapter(List<String> data) {
adapter = new AddRessListViewAdapter(data);
dialog_listView.setAdapter(adapter);
}
/**
* 地址LV 适配器
*/
class AddRessListViewAdapter extends BaseAdapter {
private List<String> addRessdData;
public AddRessListViewAdapter(List<String> addRessdData) {
this.addRessdData = addRessdData;
}
@Override
public int getCount() {
return addRessdData.size();
}
@Override
public Object getItem(int i) {
return addRessdData.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
ViewHolder vh;
if (view == null) {
vh = new ViewHolder();
view = View.inflate(context, R.layout.address_selection_listview_item, null);
vh.textView = view.findViewById(R.id.address_lv_item_text);
view.setTag(vh);
} else {
vh = (ViewHolder) view.getTag();
}
vh.textView.setText(addRessdData.get(i));
vh.textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (dialog_line_province.getVisibility() == View.VISIBLE) {
dialog_tv_province.setText(province.get(i).toString());
dialog_line_city.setVisibility(View.VISIBLE);
dialog_line_province.setVisibility(INVISIBLE);
dialog_line_district.setVisibility(INVISIBLE);
setDialodLvAdapter(citys);
} else if (dialog_line_city.getVisibility() == View.VISIBLE) {
dialog_line_city.setVisibility(INVISIBLE);
dialog_line_district.setVisibility(View.VISIBLE);
dialog_tv_city.setText(citys.get(i).toString());
setDialodLvAdapter(countys);
} else if (dialog_line_district.getVisibility() == View.VISIBLE) {
dialog_tv_district.setText(countys.get(i).toString());
}
}
});
return view;
}
class ViewHolder {
TextView textView;
}
}
}
///
XML代码:
/
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/shape_white_10"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="80px"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:orientation="horizontal">
<!-- 省份 -->
<RelativeLayout
android:id="@+id/dialog_ll_province"
android:layout_width="wrap_content"
android:layout_height="80px"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/dialog_tv_province"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="选择省"
android:textColor="@color/color333333"
android:textSize="30px" />
<View
android:id="@+id/dialog_line_province"
android:layout_width="80px"
android:layout_height="4px"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="#4cd742"></View>
</RelativeLayout>
<!-- 市级 -->
<RelativeLayout
android:id="@+id/dialog_ll_city"
android:layout_width="wrap_content"
android:layout_height="80px"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/dialog_tv_city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="选择市"
android:textColor="@color/color333333"
android:textSize="30px" />
<View
android:id="@+id/dialog_line_city"
android:layout_width="80px"
android:layout_height="4px"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="#4cd742"
android:visibility="invisible"></View>
</RelativeLayout>
<!-- 县级 -->
<RelativeLayout
android:id="@+id/dialog_ll_district"
android:layout_width="wrap_content"
android:layout_height="80px"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/dialog_tv_district"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="选择区"
android:textColor="@color/color333333"
android:textSize="30px" />
<View
android:id="@+id/dialog_line_district"
android:layout_width="80px"
android:layout_height="4px"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="#4cd742"
android:visibility="invisible"></View>
</RelativeLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="2px"
android:background="#eaf0f0" />
<View
android:layout_width="match_parent"
android:layout_height="2px"
android:background="#eaf0f0" />
<ListView
android:id="@+id/dialog_lv_location_dialog"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
剩下的颜色什么的 代码就不贴了 这个你们想定义成什么颜色都可以
简单用法:我这里是模拟数据 你们到时候可以用到你们真实的数据
在Activity 或者 Fragment 中使用
@Override
protected void initChildFragData1() {
for (int i = 0; i < 30; i++) {
provinces.add("某某省" + i);
}
for (int i = 0; i < 30; i++) {
citys.add("某某市" + i);
}
for (int i = 0; i < 30; i++) {
districts.add("某某县" + i);
}
addRessSelection.setProvinceData(provinces);
addRessSelection.setCityData(citys);
addRessSelection.setCountyData(districts);
}
@Override
protected void initChildFragView0() {
addRessSelection = view.findViewById(R.id.address_diy);
}