java高级二级联动_Android PopupWindow使用之地区、学校选择二级联动

本文介绍如何使用Android的PopupWindow组件实现二级联动选择,具体为地区和学校的选择。通过Gson解析JSON数据,利用Volley进行网络请求。详细步骤包括创建布局、初始化PopupWindow、设置点击事件、加载数据以及处理dismiss事件。
摘要由CSDN通过智能技术生成

最近在做一个社交类APP时,希望用户在注册时根据地区来选择自己所在的学校,由于用户手动输入学校,可能会出现各种问题,不利于后面对用户信 息的统计。于是决定在客户端做好设置,用户只要根据地区来选择就好。第一想法就是使用PopupWindow,用弹框的方式让用户来选择。让实现的效果如 下:

64225c6ec762928e489ee1c8a8d36704.png

ec30ce83c8340e235229f039ae0698e4.png

下面就来讲一下是如何实现的(数据是从网络获取的,JSON解析使用的是Gson,网络库用的是Volley)

工程结构:

1ad0ef69fd3e4b5e5b8c1829dba31fd2.png

1、创建一个布局文件:view_select_province_list.xml,主要包括一个TextView(用来显示标题)和两个ListView(默认显示地区ListView,隐藏SchoolListView)

48304ba5e6f9fe08f3fa1abda7d326ab.png

>

android:id="@+id/list_title"android:layout_width="match_parent"android:layout_height="50dp"android:background="#3b3b3b"android:gravity="center"android:text="选择地区"android:textColor="#ffffff"android:textSize="16sp"/>

android:id="@+id/province"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:background="#e4e4e4"android:divider="#aeaeae"android:dividerHeight="1dp">

android:id="@+id/school"android:visibility="gone"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:background="#e4e4e4"android:divider="#aeaeae"android:dividerHeight="1dp">

48304ba5e6f9fe08f3fa1abda7d326ab.png

2、初始化PopupWindow

48304ba5e6f9fe08f3fa1abda7d326ab.png

private voidinitPopView() {

parent = this.getWindow().getDecorView();

View popView = View.inflate(this, R.layout.view_select_province_list, null);

mTitle =(TextView) popView.findViewById(R.id.list_title);

mProvinceListView =(ListView) popView.findViewById(R.id.province);

mSchoolListView =(ListView) popView.findViewById(R.id.school);

mProvinceListView.setOnItemClickListener(itemListener);

mSchoolListView.setOnItemClickListener(itemListener);

mProvinceAdapter = new ProvinceAdapter(this);

mProvinceListView.setAdapter(mProvinceAdapter);

mSchoolAdapter = new SchoolAdapter(this);

mSchoolListView.setAdapter(mSchoolAdapter);

int width = getResources().getDisplayMetrics().widthPixels * 3 / 4;

int height = getResources().getDisplayMetrics().heightPixels * 3 / 5;

mPopWindow = newPopupWindow(popView, width, height);

ColorDrawable dw = new ColorDrawable(0x30000000);

mPopWindow.setBackgroundDrawable(dw);

mPopWindow.setFocusable(true);

mPopWindow.setTouchable(true);

mPopWindow.setOutsideTouchable(true);//允许在外侧点击取消

loadProvince();

mPopWindow.setOnDismissListener(listener);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

其中,要想使PopupWindow点击空白区域取消,必须设置

ColorDrawable dw = new ColorDrawable(0x30000000);

mPopWindow.setBackgroundDrawable(dw);

mPopWindow.setOutsideTouchable(true);

3、显示PopupWindow

private void showPopWindow()

{ mPopWindow.showAtLocation(parent, Gravity.CENTER, 0, 0);}

4、下载地区和学校数据(这里用的是volley和gson解析数据)

48304ba5e6f9fe08f3fa1abda7d326ab.png

private voidloadProvince() {

mRequestQueue = Volley.newRequestQueue(this);

GsonRequest request = new GsonRequest(Request.Method.POST, Config.PROVINCE_URL,

Province.class, new Response.Listener() {

@Override

public voidonResponse(Province response) {

if (response.getData() != null && response.getError_code() == 0) {

mProvinceAdapter.setList(response.getData());

mProvinceAdapter.notifyDataSetChanged();

}

}

}, newResponse.ErrorListener() {

@Override

public voidonErrorResponse(VolleyError volleyError) {

}

}, this);

mRequestQueue.add(request);

}

private voidloadSchool() {

mRequestQueue = Volley.newRequestQueue(this);

GsonRequest request = new GsonRequest<>(Request.Method.POST, Config.SCHOOL_URL + provinceId, School.class,

new Response.Listener() {

@Override

public voidonResponse(School response) {

if (response.getData() != null && response.getError_code() == 0){

mSchoolAdapter.setList(response.getData());

mSchoolAdapter.notifyDataSetChanged();

}

}

}, newResponse.ErrorListener() {

@Override

public voidonErrorResponse(VolleyError volleyError) {

}

}, this);

mRequestQueue.add(request);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

5、设置ListView 的Item点击事件

48304ba5e6f9fe08f3fa1abda7d326ab.png

/*** ListView Item点击事件

*/AdapterView.OnItemClickListener itemListener = newAdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, longid) {

if (parent ==mProvinceListView) {

ProvinceList provinceName =(ProvinceList) mProvinceListView.getItemAtPosition(position);

provinceId =provinceName.getProvince_id();

mTitle.setText("选择学校");

mProvinceListView.setVisibility(View.GONE);//隐藏地区

mSchoolListView.setVisibility(View.VISIBLE);//显示学校

loadSchool();

} else if (parent ==mSchoolListView) {

SchoolList schoolName =(SchoolList) mSchoolListView.getItemAtPosition(position);

mSelectSchool.setText(schoolName.getSchool_name());

mPopWindow.dismiss();

}

}

};

48304ba5e6f9fe08f3fa1abda7d326ab.png

6、PopupWindow设置OnDismissListener,目的是为了再次进入选择的时候,直接进入学校而不是地区的选择

48304ba5e6f9fe08f3fa1abda7d326ab.png

/*** popWindow消失监听事件

*/PopupWindow.OnDismissListener listener = newPopupWindow.OnDismissListener() {

@Override

public voidonDismiss() {

mTitle.setText("选择地区");

mProvinceListView.setVisibility(View.VISIBLE);//显示地区

mSchoolAdapter.setList(new ArrayList());//设置一个空的List,避免再次选择学校后弹出的还是刚才的地区对应的学校

mSchoolAdapter.notifyDataSetChanged();

mSchoolListView.setVisibility(View.GONE);//隐藏学校

}

};

48304ba5e6f9fe08f3fa1abda7d326ab.png

7、好了,这样一个基于PopupWindow的二级联动弹框选择就完成了,其中,还有ListView的Adapter在这里我就没有贴出来了,写法和我们平常用的适配器一样。我已经把代码开源到我的GitHub上了,有需要的可以下载看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值