目录:BaseAdapter、ArrayAdapter、SimpleAdapter
ListView
- 用来显示列表
- 每一行内容称为一个条目
- ListView的每一个条目都是一个View对象
- 不同布局文件中,资源id可以相同,找的时候注意设置在哪个布局中找
- 只要内存中有条目缓存,在新的条目出现时,就会使用缓存
MVC
- M:模型层
- javaBean
- personList
- V:视图层
- jsp
- ListView
- C:控制层
- servlet
- Adapter
ListView
- 用于显示列表
- MVC结构
- M:model模型层,要显示的数据 ————people集合
- V:view视图层,用户看到的界面 ————ListView
- c:control控制层,操作数据如何显示 ————adapter对象
- 每一个条目都是一个View对象
*
BaseAdapter
-
必须实现的两个方法
-
第一个
//系统调用此方法,用来获知模型层有多少条数据
@Override
public int getCount() {
return people.size();
} -
第二个
//系统调用此方法,获取要显示至ListView的View对象
//position:是return的View对象所对应的数据在集合中的位置
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView方法调用" + position);
TextView tv = new TextView(MainActivity.this);
//拿到集合中的元素
Person p = people.get(position);
tv.setText(p.toString());
//把TextView的对象返回出去,它会变成ListView的条目
return tv;
}
-
- 屏幕上能显示多少个条目,getView方法就会被调用多少次,屏幕向下滑动时,getView会继续被调用,创建更多的View对象显示至屏幕
条目的缓存
- 当条目划出屏幕时,系统会把该条目缓存至内存,当该条目再次进入屏幕,系统在重新调用getView时会把缓存的条目作为convertView参数传入,但是传入的条目不一定是之前被缓存的该条目,即系统有可能在调用getView方法获取第一个条目时,传入任意一个条目的缓存
ArrayAdapter
-
在条目中显示一个字符串
String[] objects = new String[]{
"张三",
"李四",
"王五"
};
ListView lv = (ListView) findViewById(R.id.lv);
//arg1:指定要填充的布局文件
//arg2:指定文本显示至哪一个文本框内
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_array, R.id.tv_name, objects));
SimpleAdapter
- 可在条目中显示多种数据
-
要显示的数据封装在List中,集合的每一个元素存放的是一个条目会显示的数据,因为可能会有多种数据,而集合的泛型只能指定一种数据,所以把数据先存放在Map中,在把Map放入List中
List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
//张三的头像和名字是两种类型的数据,先封装至Map
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("name", "张三");
map1.put("image", R.drawable.photo1);
//把Map封装至List
data.add(map1);
... 通过两个数组的下标对应指定数据存放入对应的控件中
lv.setAdapter(new SimpleAdapter(this, data, R.layout.item_array,
new String[]{“name”, “image”}, new int[]{R.id.tv_name, R.id.iv_photo}));
public class Person {
private String name;
private String phone;
private int salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
return "name=" + name + ", phone=" + phone + ", salary="
+ salary;
}
public Person(String name, String phone, int salary) {
super();
this.name = name;
this.phone = phone;
this.salary = salary;
}
}
public class MainActivity extends Activity {
List<Person> personList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
personList = new ArrayList<Person>();
//查询数据库
MyOpenHelper oh = new MyOpenHelper(this);
SQLiteDatabase db = oh.getWritableDatabase();
Cursor cursor = db.query("person", null, null, null, null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(1);
String phone = cursor.getString(2);
int salary = cursor.getInt(3);
Person p = new Person(name, phone, salary);
personList.add(p);
}
//找到listview
ListView lv = (ListView) findViewById(R.id.lv);
//设置显示内容
lv.setAdapter(new MyAdapter());
}
class MyAdapter extends BaseAdapter{
//系统调用,用来获知模型层有多少条数据
@Override
public int getCount() {
return personList.size();
}
//系统调用,返回的View对象就会作为ListView的一个条目显示在屏幕上
//position:该次getView调用返回的View对象在ListView中是第几个条目,position的值就是几
//convertView:系统之前缓存的条目
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView方法调用" + position + ":" + convertView);
Person p = personList.get(position);
// TextView tv = new TextView(MainActivity.this);
// tv.setText(p.toString());
// tv.setTextSize(16);
//获取布局填充器
// LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
// LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
// View view = inflater.inflate(R.layout.item_listview, null);
View view = null;
if(convertView == null){
//把布局文件填充成view对象
view = View.inflate(MainActivity.this, R.layout.item_listview, null);
}
else{
view = convertView;
}
//必须使用view.findViewById
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
tv_name.setText(p.getName());
TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
tv_phone.setText(p.getPhone());
TextView tv_salary = (TextView) view.findViewById(R.id.tv_salary);
tv_salary.setText(p.getSalary() + "");
return view;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
}
public class MainActivity extends Activity {
@Override
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(this, R.layout.item_listview, //指定作为条目的布局文件
// R.id.tv, //指定文本显示在哪个文本框
// objects));
//把每个条目需要处理的所有数据封装至map中,在把map封装至list中
//这样就保证了list每个元素都包含了一个条目需要的所有数据
List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("name", "菜逼");
map1.put("photo", R.drawable.photo1);
data.add(map1);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("name", "傻逼");
map2.put("photo", R.drawable.photo2);
data.add(map2);
Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("name", "牛逼");
map3.put("photo", R.drawable.photo3);
data.add(map3);
lv.setAdapter(new SimpleAdapter(this, data, R.layout.item_listview,
new String[]{"name", "photo"}, //存放键的数组
new int[]{R.id.tv, R.id.iv}));//存放资源id的数组,两个数组用下标来对应
}
}