使用Spinner实现城市级联下拉框
WilheminaDo
8年前
<p>最近写一个使用Spinner实现城市级联下拉框的Dome,现在总结一下,互相学习.</p> <p>activity_main.xml里面有三个Spinner</p> <pre> <code class="language-java"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="horizontal" tools:context=".MainActivity"> <Spinner android:id="@+id/spinner1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" /> <Spinner android:id="@+id/spinner2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:visibility="invisible" /> <Spinner android:id="@+id/spinner3" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:visibility="invisible" /> </LinearLayout></code></pre> <p>Spinner的每一个item布局,里面只有一个TextView</p> <pre> <code class="language-java"><?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="wrap_content" android:background="@color/white" android:gravity="center" android:orientation="horizontal" android:padding="5dp"> <TextView android:id="@+id/txt_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="名称" android:textSize="16dp" /> </LinearLayout></code></pre> <p>下面是SpinnerAdapter,一般会用到Adapter的有如下几个控件</p> <p>(1)列表视图控件-ListView</p> <p>(2)缩略图浏览器控件-Gallery</p> <p>(3)网格控件-GridView</p> <p>(4)下拉列表控件-Spinner</p> <p>(5)自动提示文本框-AutoCompleteTextView</p> <p>(6)支持展开/收缩功能的列表控件-ExpandableListView</p> <p>适配器的作用是用来处理数据并将数据绑定到AdapterView上,是AdapterView视图与与数据之间的一个桥梁。</p> <pre> <code class="language-java">/** * @author: xiaolijuan * @description: Spinner适配器 * @projectName: SpinnerProject * @date: 2015-10-18 * @time: 00:19 */ public class SpinnerAdapter extends BaseAdapter { private Context context; private String[] array; private int layoutId; /** * 构造方法 * @param context 上下文对象 * @param array 数组 * @param layoutId 布局Id */ public SpinnerAdapter(Context context, String[] array, int layoutId) { this.context = context; this.array = array; this.layoutId = layoutId; } /** * 获取Item总数 * @return */ @Override public int getCount() { return array.length; } /** * 获取一个Item对象 * @param position * @return */ @Override public Object getItem(int position) { return array[position]; } /** * 获取指定item的ID * @param position * @return */ @Override public long getItemId(int position) { return position; } /** * 绘制的内容均在此实现 * @param position position就是位置从0开始 * @param convertView convertView是Spinner中每一项要显示的view * @param parent parent就是父窗体了,也就是Spinner * @return */ @Override public View getView(int position, View convertView, ViewGroup parent) { View item = convertView != null ? convertView : View.inflate(context, layoutId, null); TextView txt_name = (TextView) item.findViewById(R.id.txt_name); txt_name.setText(array[position]); return item; } }</code></pre> <p>java 代码:注释写的很清楚</p> <pre> <code class="language-java">/** * 使用Spinner实现城市级联下拉框 * Spinner最简单使用方式步骤如下: * 第一步:在布局文件中添加Spinner控件。 * 第二步:在Acitvity中通过id找到它。 * 第三步:给Spinner绑定一个适配器。 * 第四步:绑定监听器就可以用了。 */ public class MainActivity extends Activity { private Spinner spinner1, spinner2, spinner3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); spinner1 = (Spinner) findViewById(R.id.spinner1); spinner2 = (Spinner) findViewById(R.id.spinner2); spinner3 = (Spinner) findViewById(R.id.spinner3); //加载省份列表 loadProvince(); //设置spinner1的监听事件 spinner1.setOnItemSelectedListener(new Spinner1ClickListener()); //加载城市列表 loadCity(); //设置spinner2的监听事件 spinner2.setOnItemSelectedListener(new Spinner2ClickListener()); //加载区域列表 loadGZArea(); //设置spinner3的监听事件 spinner3.setOnItemSelectedListener(new Spinner3ClickListener()); } /** * 加载省份列表 */ public void loadProvince() { String[] array1 = new String[]{"请选择", "广东省"}; SpinnerAdapter adapterOne = new SpinnerAdapter(this, array1, R.layout.activity_item); spinner1.setAdapter(adapterOne); } /** * 加载城市列表 */ public void loadCity() { String[] array2 = new String[]{"请选择", "广州市", "深圳市"}; SpinnerAdapter modelTwo = new SpinnerAdapter(this, array2, R.layout.activity_item); spinner2.setAdapter(modelTwo); } /** * 加载广州区域列表 */ public void loadGZArea() { String[] array3 = new String[]{"请选择", "天河区", "越秀区", "荔湾区", "海珠区", "萝岗区", "白云区", "黄埔区", "花都区"}; SpinnerAdapter modelThree = new SpinnerAdapter(this, array3, R.layout.activity_item); spinner3.setAdapter(modelThree); } /** * 加载深圳区域列表 */ public void loadSZArea() { String[] array3 = new String[]{"请选择", "龙岗区", "南山区", "福田区", "罗湖区", "盐田区", "宝安区"}; SpinnerAdapter modelThree = new SpinnerAdapter(this, array3, R.layout.activity_item); spinner3.setAdapter(modelThree); } /** * Spinner1点击事件 */ public class Spinner1ClickListener implements AdapterView.OnItemSelectedListener { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { String str = (String) adapterView.getItemAtPosition(i); //判断是否选择城市,如果没有选择那么就隐藏Spinner2,Spinner3两个下拉框,否则显示Spinner2下拉框,继续隐藏Spinner3 if (str.equals("请选择")) { spinner2.setVisibility(View.INVISIBLE); spinner3.setVisibility(View.INVISIBLE); } else { spinner2.setVisibility(View.VISIBLE); //将第二个下拉框的选项重新设置为选中“请选择”这个选项。 spinner2.setSelection(0); } Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> adapterView) { } } /** * Spinner2点击事件 */ public class Spinner2ClickListener implements AdapterView.OnItemSelectedListener { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { String str = (String) adapterView.getItemAtPosition(i); if (str.equals("请选择")) { spinner3.setVisibility(View.INVISIBLE); } else { //显示第三个Spinner3 spinner3.setVisibility(View.VISIBLE); if (str.equals("深圳市")) { //重新加载深圳区域列表 loadSZArea(); } else if (str.equals("广州市")) { //重新加载广州区域列表 loadGZArea(); } } Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> adapterView) { } } /** * Spinner3点击事件 */ public class Spinner3ClickListener implements AdapterView.OnItemSelectedListener { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { String str = (String) adapterView.getItemAtPosition(i); Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> adapterView) { } } }</code></pre> <p>下面是布局的效果图</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/9e1cb1b2f76c151934f83c8b93d111f9.png"></p> <p> </p> <p>来自:http://www.jianshu.com/p/d38003b88c8b</p> <p> </p>