今天继续学习ListView的知识
1.自定义适配器的改进
1.1 ListView的工作原理:
ListView工作的时候,会针对每个item,要求Adapter对象返回一个View(getView()方法),也 就是说,Listview在开始绘制的时候,系统首先调用getCount(),根据其返回值得到ListView的长度,然后根据这个长度,调用 getView()一行一行的绘制ListView的每一项。
1.2 ListView的缓存机制:
(1)如果有几千,几万行甚至更多的代码的时候,其中只有课件的项存在于内存中,其他的都在Recycler中,Recycle是Android中专门用来处理缓存的组件。
(2)ListView先通过getView()方法请求一个View,然后请求其他可见的View。这时convertView在getView中是空的。
(3) 当列表第一项滚出屏幕,并且一个新的项从屏幕低端上来时,ListView会再请求一个View,这时,convertView已经不是空值了,它的值是 滚动出屏幕的第一项,之 后只需要设定新的数据,然后返回convertView即可,而不必重新创建一个View。
1.3 ListView缓存实现
public View getView(int position, View convertView, ViewGroup parent) { View view; /**对ListView的优化,convertView为空时,创建一个新视图; * convertView不为空时,代表它是滚出, * 放入Recycler中的视图,若需要用到其他layout, * 则用inflate(),同一视图,用fiindViewBy() * **/ if (convertView == null) { LayoutInflater inflater = OneActivity.this.getLayoutInflater(); view = inflater.inflate(R.layout.iteam, null); //view = View.inflate(getBaseContext(),R.layout.item,null); } else { view = convertView; } costBeen costBeen = mcostBeenList.get(position); TextView money = (TextView)view.findViewById(R.id.text1); TextView beizhu = (TextView)view.findViewById(R.id.text2); TextView data = (TextView)view.findViewById(R.id.text3); money.setText(String.valueOf(costBeen.getMoney())); beizhu.setText(costBeen.getBeizhu()); data.setText(costBeen.getData()); return view; }
1.4关于findViewById()函数的多次使用的改进。每次重新加载View时,都会从当前位置重复执行此函数来加载要显示的内容,关于这一点的改进可以通过
1、创建内部类viewHolder
2、判断convertView是否为空
3、通过setTag方法将viewHolder与convertView建立关系绑定
补充:setTag()方法的作用:View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来。
public View getView(int position, View convertView, ViewGroup parent) { viewHolder view; /**对ListView的优化,convertView为空时,创建一个新视图; * convertView不为空时,代表它是滚出, * 放入Recycler中的视图,若需要用到其他layout, * 则用inflate(),同一视图,用fiindViewBy() * **/ if (convertView == null) { view=new viewHolder(); convertView= LayoutInflater.from(OneActivity.this).inflate(R.layout.iteam,parent,false); view.money=(TextView)convertView.findViewById(R.id.text1); view.beizhu = (TextView)convertView.findViewById(R.id.text2); view.data = (TextView)convertView.findViewById(R.id.text3); convertView.setTag(view); } else { view=(viewHolder)convertView.getTag(); } view.money.setText(Datas.get(i).getMoney()); view.beizhu.setText(Datas.get(i).getBeizhu()); view.data.setText(Datas.get(i).getData()); return view; } class viewHolder{ private TextView money; private TextView beizhu; private TextView data; }