ListView性能优化系列之三
上一节讲到了ListView中的垃圾回收站,用来管理回收view,这一节将继续学习源码,看看这个垃圾回收站到底是怎么用的,convertView是如何传递到adapter的getView方法的。
- makeAndAddView:
这个方法是在ListView里面,顾名思义,这个方法中有两个动词make和add,所以这个方法的作用是构造一个view并且将这个view加入到viewgroup的children list中去。
private View makeAndAddView(int position, int y, boolean flow,
int childrenLeft, boolean selected) {
View child;
if (!mDataChanged) {// 数据没有发生改变
child = mRecycler.getActiveView(position);// 从回收站的当前可见的视图列表中获取
if (child != null) {
/**
* 定位并且添加这个view到ViewGrop中的children列表,从回收站获取的视图不需要测量
* 所以最后一个参数为true
*/
setupChild(child, position, y, flow, childrenLeft, selected,true);
return child;
}
}
//获取一个view,有可能是从回收站拿到的,也可能是从新构造的一个view
child = obtainView(position, mIsScrap);
// 这个视图需要定位并且重新测量
setupChild(child, position, y, flow, childrenLeft, selected, mIsScrap[0]);
return child;
}
obtainView:当这个方法被调用时,说明Recycle bin中的view已经不可用了,那么,现在唯一的方法就是,convert一个老的view,或者构造一个新的view。
View obtainView(int position, boolean[] isScrap) {
isScrap[0] = false;
View scrapView;
scrapView = mRecycler.getScrapView(position);//从垃圾箱里面取数据
View child;
if (scrapView != null) {//当有数据的时候,直接通过老的view去convert(找不到一个合适翻译)
//调用第一节中adapter的getView方法,将scrapView传入,也就是我们的converView
child = mAdapter.getView(position, scrapView, this);
if (child != scrapView) {//返回的view和传入的scrapViwe不同
mRecycler.addScrapView(scrapView);//放入垃圾桶
if (mCacheColorHint != 0) {
child.setDrawingCacheBackgroundColor(mCacheColorHint);
}
} else {
isScrap[0] = true;
child.dispatchFinishTemporaryDetach();
}
} else {//回收站中没有拿到数据,就只能够自己去inflate一个xml布局文件,或者new一个view
child = mAdapter.getView(position, null, this);//这里传入的converView=null
if (mCacheColorHint != 0) {
child.setDrawingCacheBackgroundColor(mCacheColorHint);
}
}
return child;
}
总结:用了三篇博客,耗时一天时间(打了一下午篮球,晚上加班),关于listview性能优化也讲的差不多了,接下来要分享什么呢?明天再看吧~~大家共同进步吧
分享到:
相关推荐
这篇博客“ListView性能优化系列之一”着重探讨了如何通过深入理解源码和利用特定工具来提升ListView的性能。 首先,了解ListView的工作原理是优化的基础。ListView采用的是滚动复用机制,即“视图回收”...
【Android应用开发中ListView组件性能优化的研究】 在Android应用开发中,ListView是常见的用于展示大量数据的组件,但在处理大量数据时,如果不进行性能优化,可能会导致应用出现卡顿、延迟甚至崩溃。本文主要探讨...
- **ListView**: Android提供的可滚动视图,用于显示一系列相同的数据项。 - **Adapter**: ListView的数据源,负责将数据转化为ListView可显示的View。 2. **嵌套ListView的需求** - 当需要在一项数据内展示多级...
通过这个"ListView学习系列源码",你可以详细学习到如何创建自定义Adapter,实现ViewHolder,优化ListView性能,处理各种交互事件,以及动态加载和分页显示数据。实践这些源码,将有助于你成为一名更优秀的Android...
ListView由一系列的View(或ViewGroup)组成,每个View代表列表中的一个项,通常称为列表项视图。在Android中,我们通常使用Adapter来连接ListView和数据源,Adapter负责将数据转化为列表项视图并将其添加到ListView...
本篇文章将围绕“Android应用性能优化”这一主题,详细探讨Android应用架构的设计原则、常见性能瓶颈及其查找方法,并提供一系列有效的解决方案。 #### 一、Android应用架构设计原则 1. **模块化与解耦**:通过...
为了优化ListView的性能,通常使用ViewHolder设计模式。ViewHolder类保存了列表项视图中的各个子View,避免频繁的findViewById()操作,提高效率。 5. **点击事件处理** 可以通过设置OnItemClickListener或在...
总结来说,ListView是Android开发中处理数据展示的核心控件,熟练掌握ListView的操作和优化技巧对提升应用性能至关重要。提供的源码实例将帮助初学者快速理解这些概念并进行实践。通过学习和实践,开发者可以创建出...
7. 性能优化: 当ListView包含大量数据时,应考虑使用虚拟列表模式(Virtual Mode)。在这种模式下,ListView只在需要时绘制项,极大地提高了性能。 总之,通过自定义绘制和利用Delphi的图形API,我们可以创建出...
总的来说,ListView与TreeView的混合使用涉及到数据绑定、事件处理、用户交互和性能优化等多个方面,需要开发者具备扎实的Windows编程基础和良好的问题解决能力。通过巧妙地结合这两种控件,可以创建出功能强大、...
- 性能优化:自定义绘制可能会对ListView的性能产生影响,尤其是在大数据量时。确保在不需要时关闭自定义绘制,或者优化绘制算法,减少不必要的计算。 - 兼容性:测试在不同操作系统和屏幕分辨率下的显示效果,确保...
1. 使用ViewHolder模式:这是一种提高ListView性能的常用技巧,通过缓存视图引用,减少查找子视图的时间。 2. 减少getView()的复杂性:避免在getView()中执行耗时操作,如网络请求、图片加载等。 3. 使用AsyncTask或...
4. 使用convertView机制优化ListView性能。 5. 错误处理和异常捕获。 通过以上步骤,我们可以构建出一个功能完善的、支持翻页的ListView应用,同时能够适应大数据量的情况,提供良好的用户体验。
`ViewPager`和`ListView`的结合需要特别注意性能优化,因为它们都涉及到大量数据的加载和渲染。例如,使用`ViewHolder`模式来复用`ListView`的列表项视图,避免频繁创建和销毁视图;对于`ViewPager`,确保只加载必要...
9. **ListView性能优化**: - 由于ListView需要处理大量视图复用,因此需要注意convertView的使用,避免不必要的视图创建,提高性能。 10. **其他控件替代**: - 虽然标题提到“非CheckBox”,但还可以考虑使用...
在Android开发中,ScrollView与ListView的共存是一个常见的需求,特别是在设计复杂布局时。这两个组件都是用于滚动内容,但它们的使用方式和目的各...同时,也要注意性能优化,避免因不当的布局设计而带来的额外负担。
在实际应用中,考虑到性能优化,可以使用ViewHolder设计模式来复用ListView的子项View,减少因频繁创建新View导致的性能损耗。ViewHolder是一个简单的类,用于存储ListView项View的引用,这样在填充数据时就可以直接...
2. **性能考虑**:大量的自定义绘制可能会导致性能下降,尤其是在大数据量的情况下,需要注意优化。 3. **用户可配置性**:提供用户自定义颜色的选项,增加应用程序的灵活性和易用性。 #### 六、扩展知识点 - **...
5. **性能优化**:当`ListView`中的数据量较大时,性能问题不容忽视。通过虚拟化技术(例如`VirtualizingStackPanel.IsVirtualizing="True"`),只加载当前可视区域内的项,可以显著提升性能。此外,合理设置`...