我们经常会在应用程序中使用列表的形式来展现一些内容,ListView就是用来展示这些信息的控件。要使用ListView,首先要了解什么是适配器。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView,后面还会学习其他的)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便. 常见的有ArrayAdapter<T>用来绑定一个数组,支持泛型操作,SimpleAdapter用来绑定在xml中定义的控件对应的数据.SimpleCursorAdapter用来绑定游标得到的数据. BaseAdapter自定义一个适配器
首先新建一个item_listview的布局页面
<?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:orientation="horizontal" >
<ImageView
android:id="@+id/iv_photo"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/photo3"
/>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名字"
android:textSize="22sp"
android:layout_gravity="center_vertical"
/>
</LinearLayout>
一 ArrryAdapter的使用
java代码:protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] objects = new String[]{
"老王",
"老赵",
"呵呵"
};
ListView lv = (ListView) findViewById(R.id.lv);
// lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, R.id.tv_name, objects));
java代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.lv);
//集合中每个元素都包含ListView条目需要的所有数据,该案例中每个条目需要一个字符串和一个整型,所以使用一个map来封装这两种数据
List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("photo", R.drawable.photo1);
map1.put("name", "小志的儿子");
data.add(map1);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("photo", R.drawable.photo2);
map2.put("name", "小志");
data.add(map2);
Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("photo", R.drawable.photo3);
map3.put("name", "赵帅哥");
data.add(map3);
lv.setAdapter(new SimpleAdapter(this, data, R.layout.item_listview,
new String[]{"photo", "name"}, new int[]{R.id.iv_photo, R.id.tv_name}));
}
三 BaseAdapter的使用
* 必须实现的两个方法
* 第一个
//系统调用此方法,用来获知模型层有多少条数据
@Override
public int getCount() {
return people.size();
}
* 第二个
//系统调用此方法,获取要显示至ListView的View对象
//position:是return的View对象所对应的数据在集合中的位置
// 第一次调用就是0 ,第二次就是1 第三次就是2
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView方法调用" + position);
TextView tv = new TextView(MainActivity.this);
//拿到集合中的元素
Person p = peoplelist.get(position);
tv.setText(p.toString());
//把TextView的对象返回出去,它会变成ListView的条目
return tv;
}
* 屏幕上能显示多少个条目,getView方法就会被调用多少次,屏幕向下滑动时,getView会继续被调用,创建更多的View对象显示至屏幕
* 当条目划出屏幕时,系统会把该条目缓存至内存,当该条目再次进入屏幕,系统在重新调用getView时会把缓存的条目作为convertView参数传入,
但是传入的条目不一定是之前被缓存的该条目,即系统有可能在调用getView方法获取第一个条目时,
传入任意一个条目的缓存
示例:
class MyAdapter extends BaseAdapter{
//系统调用,用来获知集合中有多少条元素
@Override
public int getCount() {
return personList.size();
}
//由系统调用,获取一个View对象,作为ListView的条目
//position:本次getView方法调用所返回的View对象,在listView中是处于第几个条目,那么position的值就是多少
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Person p = personList.get(position);
// TextView tv = new TextView(MainActivity.this);
System.out.println("getView调用:" + position + ";" + convertView);
// tv.setText(p.toString());
// tv.setTextSize(18);
View v = null;
//判断条目是否有缓存
if(convertView == null){
//把布局文件填充成一个View对象
v = View.inflate(MainActivity.this, R.layout.item_listview, null);
}
else{
v = convertView;
}
//获取布局填充器对象
// LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
// 使用布局填充器填充布局文件
// View v2 = inflater.inflate(R.layout.item_listview, null);
// LayoutInflater inflater2 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
// View v3 = inflater2.inflate(R.layout.item_listview, null);
//通过资源id查找组件,注意调用的是View对象的findViewById
TextView tv_name = (TextView) v.findViewById(R.id.tv_name);
tv_name.setText(p.getName());
TextView tv_phone = (TextView) v.findViewById(R.id.tv_phone);
tv_phone.setText(p.getPhone());
TextView tv_salary = (TextView) v.findViewById(R.id.tv_salary);
tv_salary.setText(p.getSalary());
return v;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}