listView的优化

listView的优化:

view.inflate()这个操作是很耗时间跟内存的

如果listview上面有十个条目那么系统会加载十一个条目的信息,每显示新的条目都会创建新的一个条目.解决方案就是复用旧的被移除的对象,不用inflate()操作来产生新的对象,在google工程师给我们的getView的方法中有一个View converView这是一个历吏的View对象,要复用文档中说明了必须要判断view不为空,布局复用的类型要合适.

1.判断历史缓存是view对象是否为空,如果不为空并且类型合适就可以复用这个历史缓存的view对象

View view;

//这个显示的条目是RalativeLayout相对布局的

if(convertView != null && convertView instanceof RalativeLayout){

view = convertView;}else{

view = View.inflate(getapplicationContext(),R.layout.call_sms_item,null);}

 

view.findViewById()这个也是一个很耗时间跟内存的

因为每次都要找控件的id这个是很费时,而且每次都在是方法中创建一个变量,如果调用次数上万的话内存就有危险了而且每次方法调用都要变量释放跟创建这也是消耗系统性能的,可以做以下的处理,

1.定义一个静态内部类ViewHolder,在静态内部中定义控件的引用

2.在else中新创建显示条目中把这个类进行负值然后通过view.setTag(holder);在创建新布局的时候,获取到布局里面的控件的引用,存放到当前的view对象里面

3.在使用缓存view对象的代码中可以使用holder = (ViewHolder)view.getTag();//使用缓存view对象里面的控件id的引用,目的减少查找控件的次数

4.下面的设置文本之类都可以用这个holder存的引用对象去设置

 

 

如果listView数据太多,会造成内存溢出,加载数据慢,现在处理是分批加载数据

1.dao中分页查询出数据,参数指定从第几条数据开始,最大条数(一次最多获取20条数据)

分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录

select * from Account limit 5 offset 3 或者 select * from Account limit 3,5

 

2.判断用户是否拖动到了界面的最下方,注册一个监听器

iv_call_sms_safe.setOnScrollListener(OnScrollListener);这个接口中有两个方法一个是onScrollStateChanged(当listview的滚动状态发生改变的时候调用,还有一个方法是onScroll(当listview在滚动的时候调用的方法)

 在onScrollStateChanged(AbsListView view,int scrollState)

view:当前滚动的listview对象

scrollState:滚动的状态

OnScrollListener.SCROLL_STATE-IDLE;这个表示当前是静止状态

3.如果是静止状态,那么我们就判断在listView里面最后一个用户可见的条目是否是 listview数据适合器里面最后一个条目

int postion = lv_call_sms_safe.getLastVisiblePosition();//得到最后一个用户可见的条目这个是从零开始的

int maxitem = blacknumbers.size()//这个是数据适配器里面有多少个条目,这个是从1开始的

4.我们就判断我们见到的postion是否跟maxitem是否相同,如果相同就表示到了最后一个条目(用户把界面拖动到了最下面)

5.就添加更多的数据,就是再加载20条数据

1>数据库查出后20条记录

2>查出来的记录加入到适配器的集合中

3>更新界面

4>adapter.notifyDataSetChanged();

6.最后判断数据库多少条目,然后跟现在最后的条目是相等,相等说明已经全部显示了

Cursor cursor = db.rawQuery("select * from blacknumber",null);

total = cursor.getCOunt();得到总记录数

这个还要注意如果数据太多的话会导致内存溢出,就要考虑分页的方法了

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章