我们觉得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来回拖拽毫无压力。
分享到:
相关推荐
android studio移动开发基础:adapterview PPT
是否厌倦了前面“平淡无奇”的UI组件学习,感觉功能just soso?没关系,从本集开始,疯兄将给众位...这个Adapter可谓神通广大,变幻莫测,他在兵马未动之前,提供各种粮草弹药,具体怎么提供,跟疯兄一起来解开帷幕吧
一个AdapterView工具,仿照Android里面的AdapterView,用于Unity中
在 AdapterView 和 RecyclerView 中通用的 Adapter 和 ViewHolder。RecyclerView 支持 DataBinding 、多种 Item 类型、添加 Header 和 Footer
个人实现了一个比较简单的AdapterView的实现类,希望能够帮助到大家理解AdapterView的实现。
在 AdapterView 和 RecyclerView 中通用的 Adapter 和 ViewHolder。 BGAAdapterViewAdapter 和 BGAViewHolderHelper 用于简化 AdapterView 的子类(如 ListView、GridView)的适配器的编写 BGARecyclerViewAdapter...
要在AdapterView(ListView、GridView等诸如此类的视图)没有数据时显示自定义的视图。
Adapter对象是AdapterView和底层数据见的桥梁。Adapter用于访问数据项,并且负责为数据项生成视图 AdapterView是一个抽象类,用于那些需要通过Adapter填充自身的视图,其常见子类是ListView。显示AdapterView时会...
It supports AdapterView(ListView,GridView,etc) and RecyclerView. Dependency compile 'com.barryzhang:temptyview:0.0.1' Usage I. Initialize initialize some custom attributes —— this step is not ...
常用Adapter配合ListView使用实例
listview子项(Item)的取值存在很多问题,常常会因为方法不对而取到空值,或者直接抛空指针异常。对于这些问题,也许你曾和我一样困惑,不过,我相信,你看完我的例子之后可以茅塞顿开。为了照顾新手、菜鸟,本人...
适用于Android的可缩放ImageView可以在AdapterView和Recyclerview中使用。一个可拉伸拉伸的ImageView,可在AdapterView和RecyclerView中使用。 特征 使用多点触控进行缩放。 可以在AdapterView和Recyclerview中...
在AdapterView和RecyclerView中通用的Adapter和ViewHolder,使AdapterView和RecyclerView适配器的使用方式基本一致。效果图:示例代码:使用非常简单,这里展示一下ListView和RecyclerView实现qq聊天界面的适配器。...
Easy way to integrate it with your recyclerview adapter. Overlapping space as you want. Number of items to show in gallery as overlapped. Different scroll animations. Orientation. Usage ...
Spinner 与 Gallery 都继承了AbsSpinner,AbsSpinner 继承了AdapterView,因此它也表现出AdapterView的特征:只要为AdapterView提供Adapter即可。 1.相关属性 android:dropDownHorizontalOffset:设置列表框的水平...
setOnItemSelectedListener(new " "OnItemSelectedListener() { " "@Override " "public void onItemSelected(AdapterView<?> parent, View view, " "int position, " "long id) { " "tv。setText("您选择...
如何避开在ListView等AdapterView上动态添加删除项的陷阱,下面就为大家分享,具体内容如下 首先,定义如下array资源,作为列表的加载内容: <string name=app_name>MyListView <item>Java <item>C <item>...
parent:官方解释为:The AdapterView where the click happened,也就是用户所点击的AdapterView,这个参数一般不用。 view:当前点击的列表项所对应的布局View对象,可通过这个参数获得相应的列表项内部的组件,...
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "我是ListActivity" + numbers[position], Toast.LENGTH_SHORT).show(); } }
StackPagerLayout支持像翻书一样的边沿滑动,继承于AdapterView,实现了控件的复用功能 StackPagerLayout.java: reloadAndSmoothMoveNext():重新load下一个view,并平滑过度到该view movePre:前移 moveNext:后移 ...