1. MVC; mode 数据模型(List<Person>)
view 视图(ListView)
controller 控制器(把mode层的数据绑定到view上去)(Adapter适配器)
2. LayoutInflater 类可以把一个xml布局文件, 转换成一个view对象
3.普通ListView
public class MainActivity extends Activity {
private List<Person> personList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView mListView = (ListView) findViewById(R.id.listview);
PersonDao dao = new PersonDao(this);
personList = dao.queryAll();
// 把view层对象ListView和控制器BaseAdapter关联起来
mListView.setAdapter(new MyAdapter());
}
/**
* @author andong
* 数据适配器
*/
class MyAdapter extends BaseAdapter {
private static final String TAG = "MyAdapter";
/**
* 定义ListView的数据的长度
*/
@Override
public int getCount() {
return personList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
/**
* 此方法返回的是ListView的列表中某一行的View对象
* position 当前返回的view的索引位置
* convertView 缓存对象
* parent 就是ListView对象
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = null;
if(convertView != null) {
// 判断缓存对象是否为null, 不为null时已经缓存了对象
Log.i(TAG, "getView: 复用缓存" + position);
tv = (TextView) convertView;
}
else
{
// 等于null, 说明第一次显示, 新创建
Log.i(TAG, "getView: 新建" + position);
tv = new TextView(MainActivity.this);
}
tv.setTextSize(25);
Person person = personList.get(position); // 获得指定位置的数据, 进行对TextView的绑定
tv.setText(person.toString());
return tv;
}
}
}
4.自定义的ListView
public class MainActivity2 extends Activity {
private List<Person> personList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView mListView = (ListView) findViewById(R.id.listview);
PersonDao dao = new PersonDao(this);
personList = dao.queryAll();
// 把view层对象ListView和控制器BaseAdapter关联起来
mListView.setAdapter(new MyAdapter());
}
/**
* @author andong
* 数据适配器
*/
class MyAdapter extends BaseAdapter {
private static final String TAG = "MyAdapter";
/**
* 定义ListView的数据的长度
*/
@Override
public int getCount() {
return personList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
/**
* 此方法返回的是ListView的列表中某一行的View对象
* position 当前返回的view的索引位置
* convertView 缓存对象
* parent 就是ListView对象
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if(convertView == null) {
// 布局填充器对象, 用于把xml布局转换成view对象
LayoutInflater inflater = MainActivity2.this.getLayoutInflater();
view = inflater.inflate(R.layout.listview_item, null);
}
else {
view = convertView;
}
// 给view中的姓名和年龄赋值
TextView tvName = (TextView) view.findViewById(R.id.tv_listview_item_name);
TextView tvAge = (TextView) view.findViewById(R.id.tv_listview_item_age);
Person person = personList.get(position);
tvName.setText("姓名: " + person.getName());
tvAge.setText("年龄: " + person.getAge());
return view;
}
}
}
-------------------------------------------------------------------------例子:手机安全卫士05------------------------------------------------------------------------
1.ListView的优化
a.findViewById() 遍历id(记录内存中的id)
private class CallSmsSafeAdapter extends BaseAdapter{
@Override
public int getCount() {
return infos.size();
}
//有多少个条目被显示,这个方法就会被调用多少次
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
//1.减少内存中view对象创建的个数
if(convertView==null){
Log.i(TAG,"创建新的view对象:"+position);
//把一个布局文件转化成 view对象。
view = View.inflate(getApplicationContext(), R.layout.list_item_callsms, null);
//2.减少子孩子查询的次数 内存中对象的地址。
holder = new ViewHolder();
holder.tv_number = (TextView) view.findViewById(R.id.tv_black_number);
holder.tv_mode = (TextView) view.findViewById(R.id.tv_block_mode);
holder.iv_delete = (ImageView) view.findViewById(R.id.iv_delete);
//当孩子生出来的时候找到他们的引用,存放在记事本,放在父亲的口袋
view.setTag(holder);
}else{
Log.i(TAG,"厨房有历史的view对象,复用历史缓存的view对象:"+position);
view = convertView;
holder = (ViewHolder) view.getTag();//5%
}
holder.tv_number.setText(infos.get(position).getNumber());
String mode = infos.get(position).getMode();
if("1".equals(mode)){
holder.tv_mode.setText("电话拦截");
}else if("2".equals(mode)){
holder.tv_mode.setText("短信拦截");
}else{
holder.tv_mode.setText("全部拦截");
}
return view;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
/**
* view对象的容器
*记录孩子的内存地址。
*相当于一个记事本
*/
static class ViewHolder{
TextView tv_number;
TextView tv_mode;
ImageView iv_delete;
}