但是这样的代码还是有很多问题的,你可以在getView中打印下日志,输出创建的layout,你就会发现竟然每一行的layout都是新的,这样的话很消耗系统资源,(10行可能太少了,多搞点,在拖动的时候 就会发现了,写多少行,就给你高多少个layout)
所以Android官方 推荐用convertView+ViewHolder的方式来提高性能,这样系统只会创建当前页显示数量+1个layout,就可以是layout复用,其他的行都只用创建好的layout就可以了
优化代码如下:
class ViewHolder{//ViewHolder自己创建就好了,这是内部类,因为当前类只要MainActivity使用就好了,所以不需要新建一个class文件了
TextView mTextView;//官方的源代码中,成员变量就是这样写的
//(前面加个m这样只要看到他就知道这个变量是成员变量了,后面名字随便)
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView1);//读取listView的
BaseAdapter adapter = new BaseAdapter()//创建一个适配器,这是一个内部类了
{
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
/*
* getView 加载每一行的时候系统会自动调用这个方法,所以要在这个方法中创建当前行样式
* 主要参数:1、position:当前行的id
* 2、convertView:是一个缓存,存取listview滑动时缓存最先消失的那个行布局,
* 后面显示的行就可以复用这个convertView了,这样就可以达到复用的效果,节省资源
*
* 3、parent:The parent that this view will eventually be attached to
* (额这是官方解释了。。。sorry~ 没用过具体怎么样我也不知道)
*/
//开始创建行,
RelativeLayout layout = null;
ViewHolder holder = null;
if(convertView == null){//当缓存为空是 创建layout
LayoutInflater inflater = getLayoutInflater();
layout = (RelativeLayout) inflater.inflate(R.layout.list_item, null);
//以上两行代码 获取每行的布局
holder = new ViewHolder();//创建holder;
holder.mTextView = (TextView) layout.findViewById(R.id.textView1);//讲获取到的行组件放入holder中
/*这里存在一个问题 layout是两个东西怎样将 layout和holder联系在一起呢?
*不用担心,View类提供了一个方法,setTag(Object obj);
*这个方法可以将holder像一个物品一样放入一个叫Tag 的袋子里
*这样就可以 复用 行布局和布局中的组件了
**/
layout.setTag(holder);
}else{//有缓存时 就直接将缓存中的convertView给layout就好了
layout = (RelativeLayout) convertView;
holder = (ViewHolder) layout.getTag();
}
//更新组件内容
holder.mTextView.setText("title"+position);//前面有说过position是代表当前行的id 从零开始计数
return layout;//一定要记得将创建好的行布局 返回给 系统,不然 你讲神马都看不到了
}
@Override
public long getItemId(int position)
{
return 0;
}
@Override
public Object getItem(int position)
{
return null;
}
@Override
public int getCount()//设置要创建多少行
{
return 10;//表示要创建10行
}
};
listView.setAdapter(adapter);//将创建的适配器(adapter)放到listview中
}
呵呵 优化好啦,这时候可以试试在打日志看看。