我们觉得ListView卡卡的时候就会自然的去寻找优化大法,LZ也一样。一方面拼命优化view的结构一方面另外找到了这么一个广为流传的 ViewHolder、ViewCache办法:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.topic_list, null);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
}
public class ViewHolder {
public TextView getTitle() {
if (title == null) {
title = (TextView) baseView.findViewById(R.id.title);
}
return title;
}
}
大概思想是setTag();getTag();来保存已经加载过了的 ViewHolder 组件,现在我称ViewHolder 为ABCD 意为毫无特殊意义的类,顶多用到了单例的思想
但是我觉得这些都是毫无意义的, 用tag来保存ViewHolder 这个属于耍小聪明的意思,曲解了tag的本意。另外整个代码并没有真正达到需要的要求
Listview的展现可以看成是分页,系统会加载第一页 我们从写getView 的时候convertView是null 可以看成是第一页的样式没有被初始化。
这个时候我们
holder = new ViewHolder(); convertView = inflater.inflate(R.layout.topic_list, null);
holder.title = (TextView) convertView.findViewById(R.id.title);
开始进行初始化的工作,”第二页“之后这些不必再进行,所以 我认为网上所说的优化指的就是减少“第一页”之后的View创建。这个确实是不错。
但是这种优化没有实质上的改进,有时候我在想为什么全部加载完毕listView回拉还会调用getView()把我的一些初始化代码再来一遍?这个显然是不合理的,而且
不仅仅是初始化问题,一个listView之所以卡主要原因在于来回的进行逻辑操作,例如:listView里面有imageview 而且里面的image是从网络上的,而且你没有存到本地
之类的处理,而且显示出来的时候还要根据width来控制整张图片的尺寸进行缩放,加载listview不可避免的需要做这些操作也就算了,如果已经加载过了这些数据
在来回拖拽的时候也要再操作一遍就会令人无法忍受!
怎么去优化?一方面,我们知道了第一页之后不必要再new 新的View出来,另外一方面我们知道了最重要的是View的内容部能来回、重复初始化。
个人觉得android里面应该有这样的“属性”或者“设置” 让每一项加载过之后不需要再加载直接使用”缓存“的数据。
但是我没有发现这种“设置”,于是我在Adapter 里面用一个HashMap<integer view> 储存对应的View
HashMap<integer view> m = new HashMap<integer view>();
public View getView(int position, View view, ViewGroup parent) {
View convertView = m.get(position);
if (convertView != null) {
return convertView;
} else {
convertView = inflater.inflate(R.layout.topic_list, null);
TextView title = (TextView) convertView
.findViewById(R.id.title);
m.put(position, convertView);
}
}
暂时就这样了,潜在的问题和其他优化没有细想,成果是 20行带较大的图片的listView来回拖拽毫无压力。 </integer></integer></integer>
分享到:
相关推荐
AdapterView是Android系统中一个非常重要的组件,它是ListView、GridView、Spinner等视图的...记得在实现过程中注重性能优化,合理利用convertView,以及正确处理各种事件回调,这将使你的AdapterView更加高效和健壮。
这是AdapterView(包括ListView)的核心优化机制,称为“视图复用”或“convertView复用”。通过重用已有的视图,减少了内存分配和对象创建,提高了滚动流畅性。 ```java if (convertView == null) { ...
2. **设置Adapter**:将Adapter设置到对应的AdapterView,如ListView或RecyclerView,通过调用`setAdapter(Adapter adapter)`方法。 3. **实现数据绑定**:在Adapter的`getView()`方法中,将数据项与视图元素进行...
6. **测试与优化**:在实际应用中,确保在不同场景下,如数据加载中、数据为空、数据存在等情况下,空视图都能正确显示并响应用户的交互。 通过以上步骤,我们可以实现一个功能完善且设计精美的自定义空视图。在...
### Adapter继承关系结构图知识点详解 #### 一、Adapter继承结构概述 在Android开发中,`Adapter`是一种非常重要的组件,主要用于将数据...此外,熟悉这些继承结构还有助于优化性能,提高应用的响应速度和用户体验。
这里的"adapter封装"指的是对BaseAdapter进行优化和简化,以便开发者能够更便捷地使用它来填充ListView或者其他视图控件。BaseAdapter是Android系统提供的一种默认适配器,可以将各种数据类型的数据绑定到 ...
6. 性能优化: 为了提高性能,ListView使用了视图复用机制。这意味着当用户滚动时,一些已不可见的视图会被重新使用。因此,在Adapter的`getView()`方法中,我们需要检查`convertView`是否为空,以决定是创建新视图...
记住,为了性能优化,应使用ViewHolder模式来减少查找视图的时间。 以上就是如何在Android中使用自定义Adapter显示ListView并响应item点击事件的基本步骤。这只是一个基础示例,实际应用中可能需要处理更多细节,如...
ListView是一个继承自AdapterView的列表控件,通过Adapter适配器类为它提供数据。ListView中的每一个列表项(item)占据屏幕的一行,且每行的布局是相同的,数据显示与布局是分离的。这种分离设计允许开发者使用...
这些优化技巧不仅适用于ListView,也适用于其他基于AdapterView的组件,如GridView和RecyclerView。在面试中,对于这样的问题,开发者需要具备扎实的理论基础和实践经验,以展示他们对Android性能优化的理解和能力。
需要注意的是,在实际应用中,可能还需要考虑其他细节,比如防止越界、优化性能(避免频繁刷新整个ListView)以及提供取消全选的选项等。在开发过程中,不断优化用户体验,使功能更加完善和易用,是提升App质量的...
它经常与Adapter结合使用,Adapter是连接数据源和视图的桥梁。在ListView中,我们常常会遇到需要实现复选框(CheckBox)的选择功能,包括单个反选、全选以及全不选的操作。以下是对这些功能的详细解释和实现方法。 ...
它涵盖了Adapter的使用、ViewHolder优化、滚动监听、交互事件处理、以及一些基本的性能优化技巧。通过深入研究这个项目,开发者可以更好地掌握Android应用中数据列表的实现,提升应用的用户体验。
CustomAdapter adapter = new CustomAdapter(this, itemList); listView.setAdapter(adapter); ``` 2. 添加项通常通过调用Adapter的`add()`方法来实现,然后调用`notifyDataSetChanged()`通知ListView数据已改变。 ...
它们都是AdapterView家族的一部分,通过适配器(Adapter)来绑定数据并渲染到视图上。让我们深入探讨这两个组件的实现方式以及它们的区别。 **ListView** ListView是最基础的列表组件,它能够显示一列垂直滚动的项目...
在Android开发中,ArrayAdapter是一种常用的适配器类,它用于将数据集合...在实际项目中,我们经常会根据需求进行更复杂的定制,比如使用ViewHolder优化性能,或者结合其他组件如ExpandableListView实现更丰富的功能。
Spinner继承自AdapterView,它通过Adapter来展示数据。Adapter是Android中的一个重要概念,它负责将数据源转换为视图。在Spinner中,你可以使用ArrayAdapter、CursorAdapter或自定义Adapter来绑定数据。 1. 创建...
当ListView加载时,它只会在屏幕上显示一部分View,随着用户滚动,ListView会复用这些View,通过Adapter更新显示的数据,这就是ListView的滚动优化机制——视图复用(View Recycling)。 二、Adapter机制 1. ...
本教程将详细讲解如何实现ListView的上下翻页效果,这通常涉及到数据加载策略、适配器(Adapter)的使用以及用户体验优化。 1. 数据加载策略: 在ListView中,通常采用“懒加载”策略来提高性能,即只加载屏幕可见...
这有助于优化自定义实现和解决潜在问题。 总之,将Spinner集成到ListView中需要考虑状态保持和事件处理。通过适当地管理Adapter和监听器,可以有效地解决这些问题,从而为用户提供流畅的交互体验。在实际开发中,还...