热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用listview实现简单的三级地址联动选择器

近期项目中将要使用到地址联动选择器,就想自己用listview去简单实现一下功能,然后写了一个小demo。效果如下:其实原理非常简单,就是对listview的滑动监听。然后

近期项目中将要使用到地址联动选择器,就想自己用listview去简单实现一下功能,然后写了一个小demo。效果如下:
简单地址三级联动
其实原理非常简单,就是对listview的滑动监听。然后做响应的操作就行了。
首先我们看看xml文件,简单的三个listview:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">


<ListView
android:id="@+id/lv_list"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />


<ListView
android:id="@+id/lv_list2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />


<ListView
android:id="@+id/lv_list3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2" />

LinearLayout>
<Button
android:id="@+id/bt_choose"
android:text="choose"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/tv_showcity"
android:layout_width="match_parent"
android:layout_height="match_parent" />



LinearLayout>

需要用到的json文件,放在assets目录下。
地址:下载地址

将其读取出来,读取为字符串

private String InitData() {
StringBuffer sb = new StringBuffer();
AssetManager mAssetManager = this.getAssets();
try {
InputStream is = mAssetManager.open("city.json");
byte[] data = new byte[is.available()];
int len = -1;
while ((len = is.read(data)) != -1) {
sb.append(new String(data, 0, len, "utf-8"));
}
is.close();
return sb.toString();
} catch (IOException e) {
e.printStackTrace();

}
return null;
}

将listview设置为固定显示5个条目:

private void initListview(final ListView listview,Adapter adapter) {
View listItem = adapter.getView(0, null, listview);
listItem.measure(0, 0);
int totalHei = (listItem.getMeasuredHeight() + listview.getDividerHeight()) * 5;
listview.getLayoutParams().height = totalHei;
listview.setSelection(mlist.size() * 1000);

}
创建3个集合,用于存放三个listview的数据,使用Gsonformat创建出json的bean类 :City。然后使用Gson解析json ,将数据加入到三个集合中:
 String jsOnstr= InitData();

Gson gson = new Gson();
final City city = gson.fromJson(jsonstr, City.class);

for(City.CitylistBean citylistBean : city.getCitylist()) {
mlist.add(citylistBean.getP());
}

for (City.CitylistBean.CBean cBean : city.getCitylist().get(0).getC()) {
mlist2.add(cBean.getN());
}

if(city.getCitylist().get(0).getC().get(0).getA() != null) {
for (City.CitylistBean.CBean.ABean aBean :city.getCitylist().get(0).getC().get(0).getA()) {
mlist3.add(aBean.getS());
}
mdapter3 = new MyCityListAdapter(PickerActivity.this, mlist3);
lvTest3.setAdapter(mdapter3);

initListview(lvTest3, mdapter3);
} else {
mlist3.add("");

mdapter3 = new MyCityListAdapter(PickerActivity.this, mlist3);
lvTest3.setAdapter(mdapter3);

initListview(lvTest3, mdapter3);
}

这里的核心逻辑就是三个listview的滑动监听事件了:
listview1的监听:

//一级列表滑动监听
lvTest.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
//使得listview滑动停止时,可以显示5个完整的条目
lvTest.smoothScrollToPosition(lvTest.getFirstVisiblePosition());

popo = (lvTest.getFirstVisiblePosition()%mlist.size());

mlist2.clear();

for(City.CitylistBean.CBean cBean :city.getCitylist().get(popo).getC()) {
mlist2.add(cBean.getN());
}

mdapter2.notifyDataSetChanged();

pipi = (lvTest2.getFirstVisiblePosition()%mlist2.size());

mlist3.clear();

if(lvTest != null && mdapter3 != null && city.getCitylist().get(popo).getC().get(pipi).getA()!= null) {
for(City.CitylistBean.CBean.ABean aBean :city.getCitylist().get(popo).getC().get(pipi).getA()) {
mlist3.add(aBean.getS());
}

}else {
mlist3.add("");
}
mdapter3.notifyDataSetChanged();
break;
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

}
});
listview2的监听:
lvTest2.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
//Log.d("TTT", "" + lvTest2.getFirstVisiblePosition());
lvTest2.smoothScrollToPosition(lvTest2.getFirstVisiblePosition());

pipi = (lvTest2.getFirstVisiblePosition()%mlist2.size());

mlist3.clear();

if(lvTest != null && mdapter3 != null && city.getCitylist().get(popo).getC().get(pipi).getA()!= null) {
for(City.CitylistBean.CBean.ABean aBean :city.getCitylist().get(popo).getC().get(pipi).getA()) {
mlist3.add(aBean.getS());
}



}else {
mlist3.add("");
}
mdapter3.notifyDataSetChanged();

break;
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

}
});

listview3的监听:

 lvTest3.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
lvTest3.smoothScrollToPosition(lvTest3.getFirstVisiblePosition());


break;
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

}
});


}

主要逻辑就是这些,最后就是button设置监听,拿到每个列表选中的数据,显示在下方的textview中:

private String getChooseItemStr(ListView listView , List mlist) {
return mlist.get(listView.getFirstVisiblePosition()%mlist.size());
}
bt_choose = (Button) findViewById(R.id.bt_choose);
tvShowCity = (TextView) findViewById(R.id.tv_showcity);
bt_choose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str1 = getChooseItemStr(lvTest,mlist);
String str2 = getChooseItemStr(lvTest2,mlist2);
String str3 = getChooseItemStr(lvTest3, mlist3);

str = str1+str2+str3 + "\r\n" + str;
tvShowCity.setText(str);
}
});

以上就是demo的全部内容,当然demo实现的比较简单。有其他需求的可以继续修改代码。三级地址联动选择器有很多优秀的三方框架,本demo仅供参考。
源码下载地址


推荐阅读
  • 这两天用到了ListView,写下遇到的一些问题。首先是ListView本身与子控件的焦点问题,比如我这里子控件用到了Button,在需要ListView中的根布局属性上加上下面的这一个属性:and ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 安卓中的刮刮卡视图,示例原文:https://www.gee ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 在一对一直播源码使用过程中,有时会出现软键盘切换闪屏问题,就是当切换表情的时候屏幕会跳动,因此要对一对一直播源码表情面板无缝切换进行优化。 ... [详细]
  • 四、连接屏幕流各位读者好!我们已经到了应用开发的一个重要阶段——连接屏幕。如您所知,我们在上一章 ... [详细]
  • 摘要:1、有两台服务器(1)看代码网(记为A):内网IP:10.186.73.30 ... [详细]
  • 如果程序的窗口仅仅需要显示一个列表,则可以直接让Activity集成ListActivity来实现,ListActivity的子类无须调用setContentView方法来显示某个 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
author-avatar
万承裕常明
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有