ListView
- 就是用来显示一行一行的item的
- MVC结构
- M:model模型层,要显示的数据 ————people集合
- V:view视图层,用户看到的界面 ————ListView
- c:control控制层,操作数据如何显示 ————adapter对象
- 每一个item都是一个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方法获取第一个条目时,传入任意一个条目的缓存
将item_layout加载到程序中,三种形式
//1、使用View
View v = View.inflate(MainActivity.this, R.layout.item_listview, null)//2、使用 LayoutInflater
//获取布局填充器对象
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
// 使用布局填充器填充布局文件
View v2 = inflater.inflate(R.layout.item_listview, null);//3、getSystemService
LayoutInflater inflater2 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View v3 = inflater2.inflate(R.layout.item_listview, null);获取item_layout中的组件
//通过资源id查找组件,注意调用的是View对象的findViewById
TextView tv_name = (TextView) v.findViewById(R.id.tv_name);
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) { 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; } //通过资源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; } }