展会信息港展会大全

Android中AdapterView/Adapter的深度学习
来源:互联网   发布日期:2015-10-02 16:16:47   浏览:1198次  

导读:BaseAdapter的深度学习 博主工作了几年,也用了几年的ListView等AdapterView控件,但关于Adapter的一些问题并没有深入下去,终于有时间学习总结下关于Bas...

BaseAdapter的深度学习

博主工作了几年,也用了几年的ListView等AdapterView控件,但关于Adapter的一些问题并没有深入下去,终于有时间学习总结下关于BaseAdapter的一些较深入的话题。本文涉及三个话题:Adapter的回收机制和效率提升,getItemViewType()/getViewTypeCount()方法以及notifyDatasetChanged()使用的注意点。

1.Adapter的回收机制和效率提升

Android在绘制Adapter时,系统首先调用getCount()方法,根据它的返回值得到ListView的长度,然后根据这个长度,调用getView()方法逐行绘制。如果ListView的长度超过了屏幕的长度,android只会绘制显示出来的Item,同时,系统会回收走隐藏的Item。

如下图所示,此时系统绘制的只有position:4到positon12这9个Item.若按箭头方法滑动,将回收position12,以及绘制position3.

总的来说,显示出来然后因为拖动而被隐藏的Item才会触发回收。在方法getView(int position, View convertView, ViewGroup parent)中,第二个参数convertView的含义:是代表系统最近回收的View。若整屏能显示9个Item,第一次打开带ListView的控件时,因为并没有回收的View,调用getVIew时,参数convertView的值会为null,否则将不是null,而是最近回收的View的引用.那么合理利用convertView将是提升Adapter效率的关键,否则将会产生大量的new View开销。

复制代码

1 @Override

2public View getView(int position, View convertView, ViewGroup parent)

3{

4Holder1 holder1 = null;

5if(null==convertView)

6{

7System.out.println("convertView == null" + " position:" + position);

8holder1=new Holder1();

9convertView=LayoutInflater.from(mContext).inflate(R.layout.textview, null);

10holder1.textView=(TextView)convertView.findViewById(R.id.textview);

11convertView.setTag(holder1);

12}

13else

14{

15holder1=(Holder1)convertView.getTag();

16System.out.println("重用:" + holder1.textView.getText());

17}

18holder1.textView.setText("position: "+position);

19return convertView;

20}

21

22class Holder1

23{

24public TextView textView;

25}

复制代码

说明一下上图中的例子,按箭头方法拖动,接下来将显示position=4的Item,系统调用getView方法时,第二个参数convertView的值将是position=12的View的引用(最近回收的一个Item的View).[读者可在convertView中用一个TextView记录下每个View的position值,就可发现这个规律]

精致的逻辑说明:系统绘制Item的View和回收Item的View时有个规则:该Item只要显示出一点点就触发绘制,但必须等该Item完全隐藏之后才触发回收。试验上例时若结果对不上请注意这条说明。

赞助本站

人工智能实验室

相关热词: android开发 教程

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港