1. 在开发的过程中我们需要从页面中显示相应的数据,例如带自动输入提示的文本框使用的AutoCompleteTextView控件,当用户输入若干个字符之后提示用户相关数据的完整情况,还有MultiAutoCompleteTextView等控件也是类似的使用情况,常用的容器类控件:列表控件ListView,下拉列表控件spinner显示数据的时候都需要使用到相关的数据适配器
列表的适配器有三种类型:
① ArrayAdapter,这个是简单常用的的适配器,表示字符串列表
② SimpleAdapter,扩充性,自定义不同效果(比如ImageView,还可以放上Button,CheckBox等等
③ SimpleCursorAdapter,与数据库结合
2. 下面简单介绍一下ArrayAdapter的使用(结合下拉列表spinner与ListView控件)
在下拉列表中选择某一项对应显示相应的内容,我这里是选择下拉列表的省份显示对应的城市
① 首先需要在布局文件中加入Spinner控件和ListView控件
② 字符串列表的初始化方法如下:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(第一个参数, 第二个参数, 第三个参数);
第一个参数表示的是当前的上下文对象(一般是Main_Activity),表示你在哪一个类里面,可以使用getApplicationContext方法来获取
第二个参数是每一个列表项显示的布局,这个参数是表明我们数组中每一条数据的布局是这个view,就是将每一条数据都显示在这个view,我们可以使用android自己内置的一个样式,使用android.R.layout.simple_list_item_1等内置样式,也可以自己写一个样式,比较常规的是在android xml文件中写一个TextView,里面设置一下宽度,高度等的样式就好了
第三个参数是我们需要显示的数据源
a)方法一: 第三个参数的话我们可以在Java文件中自己定义一个字符串数组把需要显示的数据放到字符串数组中然后把这个字符数组传进方法里面
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView listView;
private ArrayAdapter<String> arrayAdapter;
private SimpleAdapter simpleAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
listView = (ListView) findViewById(R.id.lv_list);
String data[] = {"北京","上海","天津","深圳"};
arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
//listview视图加载适配器
listView.setAdapter(arrayAdapter);
//为列表视图中选中的项添加响应事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String result = parent.getItemAtPosition(position).toString();//获取选择项的值
Toast.makeText(MainActivity.this,"您点击了"+result,Toast.LENGTH_SHORT).show();
}
});
}
}
arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
//listview视图加载适配器
listView.setAdapter(arrayAdapter);
//为列表视图中选中的项添加响应事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String result = parent.getItemAtPosition(position).toString();//获取选择项的值
Toast.makeText(MainActivity.this,"您点击了"+result,Toast.LENGTH_SHORT).show();
}
});
}
}
b)方法二:自己写一个资源文件然后将需要显示的数据写在一个字符串数组中,然后方法中的第三个参数可以从资源文件中读取相关的数据,需要使用到getResource.getStringArray来获取资源文件中的字符串数组,在实际的开发中最好将程序的逻辑与数据分离开,这样便于管理
import android.os.Bundle;
import android.app.Activity;
import android.content.res.Resources;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView listView;
private String[] data;
private ArrayAdapter<String>arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.list_view);
data = getResources().getStringArray(R.array.citys);
arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, data);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Toast.makeText(MainActivity.this,
"第" + (arg3 + 1) + "项被按下", Toast.LENGTH_SHORT)
.show();
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this,
"第" + (arg3 + 1) + "项被--长时间--按下", Toast.LENGTH_SHORT)
.show();
return true;
}
});
}
}
知道了具体的数据适配器的初始化方法之后我们可以使用上面的方法初始化适配器
3. 为布局文件中定义的spinner控件设置适配器
spinner.setAdapter(adapter);
4. 因为我们需要显示点击相应的省份显示对应的城市,所以需要为spinner绑定监听器,这里绑定的setOnItemSelectedListener
而不是setOnItemClickListener,假如绑定setOnItemClickListener会抛出异常
当用户选择某一项下拉列表的时候我们获取用户选择的是第几项,因为有好几个省份所以对应着好几个的字符串数组,这个时候我们需要根据当前用户选择的第几项下拉列表获取资源文件中对应省份下的城市,考虑到获取到的是选择的下拉列表的第几项那么我们可以在资源文件中字符数组的name属性规定为pro + "当前是第几项的序号"
这样我们就可以使用获取资源id的方法getIdentifier方法来获取对应选择的资源id是什么,getIdentifier方法的第一个参数表示资源的名称,表示你自己在资源文件中定义的xml的字符数组的name属性值,第二个参数表示的是资源的类型,比如drawable,string等,这里是字符串数组,所以使用array,第三个参数是包名
int selectedId = spinner.getSelectedItemPosition();
int proId = res.getIdentifier("pro" + selectedId, "array", getPackageName());
5. 获取到资源id之后我们接下来就可以显示相应的ListView的相关信息了
通过id获取在布局文件中定义的ListView对象,初始化适配器,为ListView绑定适配器,这个与显示下来列表是类似的,只不过在显示ListView的时候需要根据选择的下拉列表的第几项来确定显示哪一个ListView
总结一下列表控件结合适配器的使用步骤:
① 在布局文件中声明下拉列表控件或者是ListView控件
② 初始化适配器
③ 为控件绑定适配器
6. 具体的代码如下:
① layout布局文件
<?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:orientation="vertical" >
<TextView
android:id="@+id/showMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@+string/showMessage"
android:textSize="18sp"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="7dp"
/>
<!-- 注意下面的下拉列表要铺满主要设置Spinner的长度为match_parent不能是wrap_content -->
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/spinnerbackground"/>
<ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
② 自定义的下拉列表和ListView显示的布局文件(一个TextView就好了)
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:textColor="#4169E1"
android:textSize="18sp"
android:padding="10dp">
</TextView>
③ 自定义资源文件包括下拉列表显示的数据和ListView显示得到数据(资源文件写在values文件夹下)
city.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 第一个省-->
<string-array name="pro0">
<item >成都</item>
<item >绵阳</item>
<item >德阳</item>
<item >遂宁</item>
<item >南充</item>
<item >广元</item>
<item >乐山</item>
<item >泸州</item>
<item >广安</item>
<item >雅安</item>
</string-array>
<!-- 第二个省-->
<string-array name="pro1">
<item >上海</item>
<item >徐州</item>
<item >淮安</item>
<item >宿迁</item>
<item >扬州</item>
<item >盐城</item>
<item >苏州</item>
<item >苏州</item>
<item >镇江</item>
<item >连云港</item>
</string-array>
<!-- 第三个省-->
<string-array name="pro2">
<item >广州</item>
<item >深圳</item>
<item >珠海</item>
<item >汕头</item>
<item >佛山</item>
<item >韶关</item>
<item >清远</item>
<item >梅州</item>
<item >中山</item>
<item >河源</item>
</string-array>
<!-- 第四个省-->
<string-array name="pro3">
<item >武汉</item>
<item >黄石</item>
<item >十堰</item>
<item >荆州</item>
<item >宜昌</item>
<item >襄阳</item>
<item >鄂州</item>
<item >荆门</item>
<item >中山</item>
<item >黄冈</item>
</string-array>
</resources>
pro.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="pro">
<item >四川</item>
<item >江苏</item>
<item >广东</item>
<item >湖北</item>
</string-array>
</resources>
④ Java文件(MainActivity)
package com.example.exp6;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends Activity {
String[] data = null;
Spinner spinner = null;
Resources res = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spinner);
spinner = (Spinner) findViewById(R.id.spinner);
res = getResources();
data = res.getStringArray(R.array.pro);
ArrayAdapter<String> adapter = new ArrayAdapter<String>
(getApplicationContext(), R.layout.listview, data);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int selected, long arg3) {
int selectedId = spinner.getSelectedItemPosition();
int proId = res.getIdentifier("pro" + selectedId, "array", getPackageName());
data = res.getStringArray(proId);
ListView listview = (ListView) findViewById(R.id.listView);
ArrayAdapter<String> adapter = new ArrayAdapter<String>
(getApplicationContext(), R.layout.listview, data);
listview.setAdapter(adapter);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
}
⑤ 布局文件中的TextView控件的文本值(这样逻辑与数据是分离开的比较好管理)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="showMessage">
请选择省、市
</string>
</resources>