转帖!!在此感谢那些让我借我肩膀站的技术前辈们!!
此贴是直接复制eoe中前辈“笨程序员”的帖子。在此谢谢为先,至于转这个帖子的目的就是因为它很实用而且称得上经典,怕错过以后不好找而且让以后遇到此问题的童鞋们更加容易找到此答案,特转此贴!!
再次感谢“笨程序员”前辈。链接:http://www.eoeandroid.com/thread-35403-1-1.html
Adapter的作用是界面与数据之间的桥梁,通过设置适配器至ListView控件后(如调用ListView的 setAdapter(ListAdapter adapter)
),列表的每一项会显示至页面中。其实,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View,如:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return super.getView(position, convertView, parent);
}
我们看一看下面的这段代码:
public View getView(int position, View convertView, ViewGroup parent) {
View newView = mInflater.inflate(R.layout.list_item, null);
((TextView) newView .findViewById(R.id.text)).setText(DATA[position]);
((ImageView) newView .findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return newView ;
}
上面的代码块中,我通过LayoutInflater.inflate(,)将Layout文件--layout.list_item转换为View.
(注:Layout也是View的子类,但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过findViewById())
这时,如果我的ITEM项有数以千条这样多或更多呢,再以上面代码块的写法,后果自己想想吧。
于是,改用其它一种写法:
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
}
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
这时,上面的代码是不是好了很多?系统将会减少创建很多View。性能得到了很大的提升。
到这里,问一下,还有没有优化的方法呢,是有的,请看————》》:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
static class ViewHolder {
TextView text;
ImageView icon;
}
这样系统性能会得到更大的提升。
希望可能帮助到大家。这也是平时面试当中面试官经常会问到的"ListView的优化"的问题。
在技术当道的今天,希望所有有志向或者有兴趣在这个行业内发展的同志们,不断地前进,前进!
分享到:
相关推荐
在Android开发中,ListView是一个非常重要的组件,常用于展示大量数据列表。BaseAdapter则是与ListView配合使用的数据适配器,负责将数据绑定到ListView的各个视图上。本篇文章将深入探讨ListView与BaseAdapter的...
1. **ViewHolder模式**:这是ListView优化的核心。通过复用convertView,避免频繁创建新的View对象。ViewHolder模式确保了每个item的视图状态在滚动时能得到快速恢复,降低了内存分配和对象创建的开销。在`getView()...
当需求涉及列表中的每个条目本身也需要展示一个子列表时,我们就会遇到ListView的嵌套问题。本教程将详细讲解如何在Android Studio环境下实现ListView的嵌套,以满足这种复杂布局的需求。 首先,我们需要了解基本的...
ViewHolder模式是ListView优化的核心技巧,它可以避免在滚动时频繁地创建和查找视图对象。通过创建一个ViewHolder类来持有每个列表项视图中的子视图引用,并在getView()方法中重用已存在的ViewHolder,可以显著减少...
在Android开发中,ListView是展示大量数据常用的组件,但如果不进行优化,很容易引发内存溢出和界面卡顿问题,特别是当列表中包含大图时。本文将深入探讨如何对ListView进行内存优化,确保10M级别的图片加载时,应用...
综上所述,解决Android ListView中多个EditText显示混乱的问题需要理解ListView的复用机制,并针对性地调整Adapter、EditText以及ListView的行为。结合提供的源码和示例,开发者可以更直观地学习和应用这些解决方案...
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。它的高效性和可滚动性使得它在处理数据展示时十分有用。本教程将详细讲解如何在Android中使用ListView,特别是添加表头(headView)和表尾...
在Android开发中,将数据库中的数据展示在ListView上是一项常见的任务。这通常涉及到与后端服务器的交互,数据的获取,以及数据适配器的使用。以下是对这一过程的详细阐述: 首先,我们需要建立Android应用与后台...
在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。为了提升用户体验和界面设计的美观性,我们常常需要对ListView进行定制化,包括设置边框和实现圆角效果。本文将深入探讨如何在Android中实现...
在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。它通过滚动的方式高效地管理视图,使得只渲染屏幕可见的部分,从而节省系统资源。然而,随着移动应用的不断发展,用户对交互体验的需求也在...
在Android开发中,ListView是一种常用的组件,用于展示大量的数据列表。在实际应用中,我们经常需要为ListView添加多选功能,以便用户可以选取多个条目进行操作,如删除、编辑等。"android中listview多选demo"就是一...
在Android开发中,ListView和GridView是两种常用的布局控件,它们各自有其特定的应用场景。ListView主要用于展示大量的可滚动数据,而GridView则呈现一个固定的网格布局。然而,在某些情况下,我们可能需要在一个...
- 为了保证列宽的一致性,可以使用`TableLayout`或`GridLayout`作为ListView的Item布局,但需要注意,这样做可能会导致性能问题,因为TableLayout会尝试动态调整列宽,而ListView的优化是基于固定大小的Item。...
总之,处理Android ListView中的EditText焦点和数据错位问题需要对Android的视图复用机制有深入理解,并能够巧妙地运用事件监听、数据模型同步等技术。在实际项目中,开发者应该根据具体需求和场景选择最适合的解决...
4. **退出程序时的资源释放**:为避免程序退出后资源未释放导致的问题,我们需要在ListView的Adapter中添加适当的清理逻辑。比如,当ListView不再使用时,可以调用Glide的clear方法释放图片资源: ```java @...
在Android开发中,ListView是一个非常常见的组件,用于展示大量数据的列表形式。然而,随着数据量的增加,如果不进行优化,ListView的性能问题就会变得尤为突出。本篇文章将深入探讨如何对ListView进行优化,主要...
在Android开发中,`ListView`是一种常用的组件,用于展示大量数据列表。而`PopupWindow`则是用来实现临时显示一个小窗口的工具,常用于快速操作或者下拉菜单等场景。本篇将详细介绍如何在用户点击`ListView`时弹出一...
在Android开发中,ListView是一个非常重要的组件,它用于显示一列可滚动的项目,通常用于显示大量的数据。本教程将深入讲解如何在Android应用中使用ListView,以及如何结合不同的数据适配器,如ArrayAdapter和...
在Android开发中,双ListView联动是一种常见的交互设计,主要用于实现多级分类选择或者导航功能,例如在"饿了吗"、"爱鲜峰"和"美团"等应用的主菜单中,用户可以通过上层ListView的选择来筛选下层ListView的显示内容...
总之,Android中的ListView是显示大量数据列表的核心组件,通过适配器与数据绑定,配合ViewHolder模式优化性能,开发者可以实现丰富多样的列表展示效果。了解并熟练掌握ListView的使用,对于Android应用开发至关重要...