ListView的使用
一、简单使用
使用步骤
1、 布局文件添加ListView控件
<ListView
android:id="@+id/v_city_list"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
2、在对应的Activity里,将数据源准备好,可从网上下载或者从数据库中读取,利用适配器将数据传递给ListView,一般用ArrayAdapter。
//数据源
private String[] data = {"aaa", "bbb", "ccc"};
//参数(当前context, 子项布局id, 数据源),android.R.layout.simple_list_item_1为android内置的布局文件
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
MainActivity.this, android.R.layout.simple_list_item_1, data);
ListView listView = findViewById(R.id.v_city_list);
//最后调用setAdapter()
listView.setAdapter(adapter);
二、稍复杂的自定义ListView界面
使用步骤
- 定义一个实体类,作为ListView适配器的适配类型
- 自定义一个布局文件作为子项的布局
- 自定义适配器,继承ArrayAdapter<泛型为刚定义的实体类>
- 重写ArrayAdapter的一组构造函数,参数(当前context, 子项布局id, 数据源)
- 重写getVIew()方法,子项被滚动进屏幕时会被调用。
- 获取当前项City实例
- convertView参数用于将之前加载好的布局缓存,之后重用
- convertView为null时加载子项
- 结合ViewHolder对控件实例进行缓存,提高运行效率,可先看下面的 3)
- 将viewHolder存储在view中,view.setTag(viewHolder)
- 不为null时,从convertView中取出已经保存到控件实例的viewHolder,这样就避免了控件的重复实例,提高效率
- 控件设置操作
- 返回view
- 新建一个ViewHolder类保存子项控件的实例,提高效率。
- 在Activity里设置数据源,用刚重写的构造方法创建适配器实例,并用ListView实例调用setAdapter(适配器实例)即可。另外添加子项的点击监听器
- add一些自定义类的数据
- 用ListView实例调用setAdapter(适配器实例)
- 添加子项的点击监听器
- 通过position参数判断出用户点击哪个子项,然后获取相应的自定义类实例
案例
1、定义一个实体类,作为ListView适配器的适配类型
//文件:BasicBean.java
class BasicBean {
/**
* cid : CN101281002
* location : 吴川
* parent_city : 湛江
* admin_area : 广东
*/
private String cid;
private String location;
private String parent_city;
private String admin_area;
public String getCid() {
return cid;
}
public String getLocation() {
return location;
}
public String getParent_city() {
return parent_city;
}
public String getAdmin_area() {
return admin_area;
}
}
2、自定义一个布局文件作为子项的布局
//文件:R.layout.city_list_item.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/city_name"
android:layout_marginTop="20dp"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dp"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"/>
<TextView
android:id="@+id/parent_city"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"/>
<TextView
android:id="@+id/admin_area"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/parent_city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"/>
</RelativeLayout>
3、自定义适配器,继承ArrayAdapter<泛型为刚定义的实体类>
//文件:CityAdater.java
//继承ArrayAdapter<泛型为刚定义的实体类>
public class CityAdater extends ArrayAdapter<BasicBean> {
//布局文件id
private int resourceId;
// 1)重写ArrayAdapter的一组构造函数,参数(当前context, 子项布局id, 数据源)
public CityAdater(Context context, int resource, List<BasicBean> objects) {
super(context, resource, objects);
this.resourceId = resource;
}
// 2)重写getVIew()方法,子项被滚动进屏幕时会被调用。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 2-1) 获取当前项City实例
BasicBean city = getItem(position);
// 2-2) convertView参数用于将之前加载好的布局缓存,之后重用
View view;
ViewHolder viewHolder;
if (convertView == null) {
// 2-3) 为null时加载子项
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.city_list_item, parent, false);
// 2-3-1) 结合ViewHolder对控件实例进行缓存,提高运行效率,可先看下面的 3)
viewHolder = new ViewHolder();
viewHolder.cityName = view.findViewById(R.id.city_name);
viewHolder.parentCity = view.findViewById(R.id.parent_city);
viewHolder.adminArea = view.findViewById(R.id.admin_area);
// 2-3-2) 将viewHolder存储在view中
view.setTag(viewHolder);
} else {
// 2-4) 不为null时,从convertView中取出已经保存到控件实例的viewHolder,
//这样就避免了控件的重复实例,提高效率
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
// 2-5) 控件设置操作
viewHolder.cityName.setText(city.getLocation());
viewHolder.parentCity.setText(city.getParent_city());
viewHolder.adminArea.setText(city.getAdmin_area() + ",");
// 2-6) 返回view
return view;
}
// 3) 新建ViewHolder类保存控件的实例
class ViewHolder {
TextView cityName;
TextView parentCity;
TextView adminArea;
}
}
4、在Activity里设置数据源,用刚重写的构造方法创建适配器实例,并用ListView实例调用setAdapter(适配器实例)即可。另外添加子项的点击监听器。
//文件:SearchCity.java
//只写出关键代码
ListView cityListV = findViewById(R.id.v_city_list);
List<BasicBean> cities = new ArrayList<>();
// 4-1) add一些自定义类的数据
cities.add(new BasicBean(xxx参数xxx));
// 4-2) 用ListView实例调用setAdapter(适配器实例)
CityAdater cityAdater = new CityAdater(SearchCity.this, R.layout.city_list_item, cities);
cityListV.setAdapter(cityAdater);
// 4-3) 添加子项的点击监听器
cityListV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 4-3-1) 通过position参数判断出用户点击哪个子项,然后获取相应的自定义类实例
BasicBean city = cities.get(position);
String cid = city.getCid();
//自定义操作
}
});