动态获取view种类数量的话是不是就不能使用viewholder的作用进行优化

转 面试【saiz吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:3贴子:
java部分:1、jvm分区,GC(基本上后续所有地方面试都问了,基础中的基础)2、volatile和Synchronized区别3、原子性、可见性的概念4、进程与线程的区别5、线程池的概念、好处、常见的线程池举例6、Callable和Runnable的区别7、HashMap的内部原理8、ConcurrentHashMap原理Android部分:1、Android的存储方式2、Handler、Lopper、MessageQueue3、AsyncTask 为什么java已经有线程池的实现了,还要继续使用AsyncTask,AsyncTask相对于java自带的线程池的好处4、onTouch事件的处理机制5、说一下MVC以及其在Android中的应用6、说一下OOM以及你怎么解决的7、了解Android的Framework么8、说一下一个Android APP从点击打开开始,是怎样展示在用户面前的(Zygote、Ams、Wms等)网络基础部分:1、TCP、UDP的区别2、TCP的三次握手、四次挥手3、HTTP的特点4、HTTP与HTTPS的区别二面:杭州现场面,一个月了路费还没报销回来。。。现场面是一个看起来很嚣张的面试官,看你的眼神从头到尾都充满了鄙视,从一开始的感觉就很不好。。1、viewpager里面只能嵌套view吗 可不可以嵌套Activity2、假如viewpager里面的每一页都有有很大数据量的内容,那么在快速的左右滑动时,如果出现了内存被回收的情况,如何处理 假如出现了OOM,怎么处理3、同上情况,使用Fragment,又当如何?与viewpager有什么区别4、ExpandableListView的Adapter怎么写5、在ListView的每个item中如果可能出现的view都不一样,如何处理?动态获取view种类数量的话是不是就不能使用viewHolder进行优化?固定显示view如果不存在该种view就不显示的方法是否太耗内存6、ListView的Adapter的getView具体是什么机制?7、Activity之间传递大量的数据用什么方法BinderBundle不够大Socket 在同一应用中没必要使用共享内存static变量——同一应用中static变量如何控制,会不会并发出问题,如果Activity由于内存不足被kill掉,再重启的时候static变量的值还可靠吗:设置专门的访问类,进行读写控制,以及Activity重启后的初始化工作。8、SQLite在使用时 假如ActivityA是用于修改SQLite,ActivityBCDEF。。。是用来展示SQLite的内容,如何在修改SQLite的同时使得BCDEF...都立刻获得最新的数据?SQLite有没有类似于ContentObserver的这么一种监视类可以监听到SQLite内容的改变?如果广播通知所有类,那么广播可以携带多大的数据?9、假设把一个ActivityB向右滑动可以回到上一个ActivityA,B渐渐透明,A渐渐清晰,要怎么编写页面?说说你对android:theme的理解,说说你对alpha值的理解10、ListView在数据量很大图片很多的情况下怎么优化?假如一个图片,轻轻的向上滑动一丢丢,那么需要重绘吗?(什么鬼。。。)11、详细展开说一下所有LaunchMode的应用场景假如A-》B-》C,想让C后退直接到A,使用什么样的intentflag?假如A-》B-》C,C使用singleTask,C后退,后退到什么地方呢?12、在全屏显示高清大图的时候,网速慢的情况下如何显示?渐进式显示是怎么做到的?如果想显示下载进度圈圈,该如何实现?13、AsyncTask在4.x以后有什么改变?怎样改回并发执行好多个?如果一个AsyncTask结束取得结果之前Activity就因为内存原因被Destroy掉了,那会有什么情况发生?会内存泄露吗?会空指针吗?需要在Activity彻底死掉之前把AsyncTaskcancel掉吗?如果没有cancel掉,然后Activity重启了,那这个Asynctask又当如何呢?14、AsyncTask内部实现机理 与Thread+Handler有什么不同15、说一下HandlerThread16、你的APP里,是每个Activity都有一个Handler呢还是所有Activity共享一个Handler17、基于事件监听、基于事件回调 假如一个touch事件发生,那是监听器先收到还是onTouch函数先收到18、假如你要记录ListView滚动到的位置,要记录什么信息,view怎样获得坐标信息19、说一下canvas20、dialog和popupwindow的应用场景 如果popupwindow在没有dismiss的时候Activity finish了,会出现什么情况?21、了解过什么三方库?为什么不用三方库?22、你觉得安卓的未来在哪里?你自己为什么都用IOS了(╯‵□′)╯︵┻━┻23、Service和推送通知,通知有没有可能出现有推送但是通知栏收不到通知?service被kill掉会如何?如何保证service不被kill掉24、了不了解Scrollview scrollview和ListView有什么相似点 有什么不同 那如果这两个是继承关系 那应该是谁继承谁?25、dp sp px各自的应用场景是什么 换算关系是什么 使用sp的时候如果调整系统字体,显示字体会跟着调整吗?26、gallery为什么被废弃?为什么Google推荐使用viewpager代替gallery呢?有什么改进?27、handler.postAtTime不是延时post么 那handler怎么延时处理Message总结:二面问的很偏应用,面试官应该是开发网易新闻,直接不看我的APP,拿着网易新闻的APP各种问我,你看我这里是这样的,你说一下我是怎么实现的,我怎么知道你是怎么实现的啊真是的(╯‵□′)╯︵┻━┻。 之前为准备校招相对基础准备的比较多, 应用仅限于使用过的比较熟练,其他没接触过的就呵呵了。最让我生气的是,面试官居然问我,身为一个女生,你觉得你做Android开发,有未来吗?当时真是气死我了,做Android的女生怎么就没未来了 (╯‵□′)╯︵┻━┻这一面跪的很惨,面完回来就把问题全都记录下来而且每个问题都专门找了详细的解答,虽说面完这一面回来着实也是消沉了好几天,期间蘑菇街打来内推电话我还直接跟人家说改天,就是不想面了,不过后来振作回来以后也发现这一次挫折真的是一次相当宝贵的经验。二、美团(拿到offer)美团是一口气三面面完的,其实当时三面面完的人特别多,到最后收到offer的并不是那么多,感觉决定权基本在三面面试官那里吧,这种也没什么可说的。一二面面试官那里都是有一张表,每个面试官都要打分,我瞄了一下,有编程能力、操作系统。。其他没看到。。分数有2.5有3据说有人还有3.5的。是美团让我找到了之后面试的总套路,最后说。一面,40分钟,除去项目介绍等,貌似并没有问什么特殊的,我提到我平时主要做界面,所以后面的问题大多与界面相关 :ListView的优化OOM的处理GC原理循环引用的问题引用计数与可达性算法LaunchMode 这一点我之前也是简简单单准备的有四种,每种什么意思,然后网易让我发现了,大家都知道这些,重点是要知道如何应用。美团这里问到的是我A打开了B,B打开了C,C的右上角有一个叉叉,那我怎样做到使我点击C的叉叉,就直接关闭了BC回到A,PS,不可以用startActivityForResult我提到我的APP中使用到了ViewPager,面试官问,假如,ViewPager里面一页的宽度超过了屏幕的宽度,ViewPager是怎么显示的,这还真没试过。。然后问到了app是怎么通知Android系统页面有刷新的,还有view的measure函数之类的,进而讨论到了View树,然后编程就让我写View树。。编程题是,因为在有的性能比较差的机型上,view树深度过大会造成crash,那么我想做一个提醒,进入APP后首先求出这个APP的最大View树深度,如果深度过大则进行提醒。其实就是二叉树的最大深度只不过换成了View树嘛,并没有什么难度。二面,30分钟,除去项目介绍等没有什么特殊的,期间突然看到一面面试官在操作系统那里很可爱的写了一句 忘了问了。。主要问了ListView的优化、HTTP与HTTPS、进程与线程,编程题是给定一个char[],然后翻转,其实就是翻转字符串啦,然后进一步的就是给出一个句子,翻转这个句子但是不翻转其中的单词,就是剑指offer那个,也很简单。然后问了一个智力题,说有十层楼,每层楼有一个钻石,钻石大小不一,没有规律,电梯只上不下,只能选一层下电梯,拿走该层钻石,问什么样的策略可以尽量大的拿到钻石。三面,20分钟吧,基本聊人生,跟技术有关的人生,并没有什么说的。总结:其实这三面中,一面是答得最不好的,因为说了太多我平时是做界面的,面试官就把界面问到了比较深,然而我并没有准备过各种view的绘制方面的知识,所以答的不是那么的好,也是一面让我找到了我以后面试的总套路,一是要诱导面试官到你擅长的方面去,我这里就是典型的诱导错误==自己给自己挖坑了,所以以后尤其是腾讯,我就使用了另一套引导说辞。二是要逗面试官笑。。可能很没边。。但是我后续的各种面试基本上都是跟面试官说说笑笑的过的,好处一是面试官本身面试很无聊,能笑一下放松心情自然对你的印象好一些,二是在说说笑笑中,体现出来了你的沟通交流能力,这也是拿到offer以后,美团的面试官所说的,觉得我软实力很强,可能就来源于这一点。三是说说笑笑扯闲话,时间一下就过去了,面试官对于每个应聘者,时间大约都是有一个限度的,扯废话时间越长,真正考察你的时间就越短,出错的几率就越小。三、百度(面完三面,居然没消息了,呵呵呵)百度给我的最大感觉是,重编程,重算法,面经都写不了多少因为根本都没问多少,就是写写写。一面面试官比我大不了几岁,上来就问我,你们学校好有意思啊,面了这么多你们学校做移动端的,居然都是通信学院的,你们学校的计算机学院的人呢?然后就扯开了,从我们学校的培养人才的方式扯到了阿里的拥抱变化,然后扯到了阿里的股价以及百度的股价,面试了一共50分钟有30分钟在闲聊,10分钟写了个翻转字符串,10分钟问了点java基础的不能再基础的问题,上面的公司基本都问过,然后这就过了。。。二面面试官是充分的体现出来了重编程,让我自我介绍,还没介绍完呢就说,我们写个程序吧,我只好一脸委屈的说,人家刚刚就要说到最最重点的项目呢,然后他就让我继续说了。。。说完展示了一下自己的APP,之后就是写写写了。第一个让我写二叉树的深度,我想这简单啊,在美团刚写过view树的,结果写写写就写岔了。。面试官一看我卡壳了,说没事,来写个冒泡压压惊= =。。压压惊。。。写完冒泡以后,说,冷静下来没?继续写二叉树的深度吧。。冷静下来写好以后,又让写了个二分查找,问了个java的反射,就没了,然后跟我说你过了,等三面吧。看我太激动了还问我,我是不是问的太简单了。。。三面面试官跟我说,我一点都不想问技术,但是这个表上有,那我们走个过场,随便问问,就问了个android中的MVC,问了一下Activity的生命周期,没写代码,然后就是聊人生了,一聊就停不下来,聊了一个半小时,还说什么别的面试官都下了要求说最多要几个,我这里我觉得行就行,聊的特别亲切,最后走的时候还送我到电梯口。。然并卵,后来就没下文了。。没下文了你对我这么好干嘛。。。四、腾讯(拿到Offer)一面重基础,自从美团以后我一是诱导面试官去我擅长的方面,二是逗面试官笑。然而一面面试官并不笑。。从头到尾严肃脸。。首先问了一个智力题,说有1000瓶水,其中一瓶有毒,有10条狗,狗喝了毒水以后会在1小时内死去,问怎样能最快发现哪瓶水有毒。然后写了代码,用递归和非递归方式实现二叉树的前序遍历。后面我在自我介绍的时候直接就说我不是计算机出身,操作系统什么的都没学过,本身是学通信的所以网络方面了解比较多,然后面试官就开始,哦?你网络学得好?那我问下你网络。这就掉到我挖的坑里了嘛。有关网络方面,这里已经总结的比较全面,另外我自己还准备了HTTPS和TCP的慢启动和拥塞控制,不等面试官问,直接就说,从它第一个问的就开始不停的说,把网络相关的问题全都说完,面试官就一副,你果然网络学的很好的表情。我觉得如果面试官问一个你答一个,可能你都答上来了但是面试还是没有过,所以我觉得干脆在面试官问一个点的时候,把跟这个点所有相关的问题全跟他说一遍,这样一个是你自己掌握了面试的内容,一个是让面试官觉得你的知识范围的确比较广。二面面试官好帅,而且很年轻,后来听说居然是cto,惊呆了Σ( ° △ °|||)︴。也是照样说项目,说擅长网络,然后问了TCP三次握手,为什么是三次,两次为什么不行。还有,如果你的APP突然连接不上Server了,你怎么一步步排查出来是哪里的问题。紧接着就是智力题了,100层楼,两个瓶子,用你的策略在最坏情况下最少扔多少次能测出来从几楼开始扔瓶子会碎,我算出来是19次,类似于TCP拥塞控制的那么一种思想,后来出来百度了一下发现是14次,不过我前一个同学貌似答的是50+次,所以感觉表现的还行。之后问如果只有一个瓶子呢?我说那只能一层一层扔啊,最坏情况就是100次嘛,面试官一直在问,没有更好的了么?我表示想不出来。现在依旧觉得没有更好的了,如果哪位大神有更好的思路的话麻烦告诉我谢谢。三面HR,看人很准,说话很犀利,女的,好不擅长对付女的面试官,没什么可说的。我觉得腾讯校招主要是从人才培养出发,所以项目经验不足并不是什么特别大的问题,主要是基础要很扎实,脑袋要很灵光能答得上智力题,做过的项目要掌握的很清晰。五、蘑菇街(差cto没面)蘑菇街是9月1号打来电话内推面,当时正在网易消沉期,不想面,推了以后觉得不会再打来了,结果9月8号又打来面试,问的全是Android,但是比较基础,生命周期、LaunchMode、ListView与ViewPager的优化等。二面说是并到校招,然而校招仍然是一面=。=,内容跟之前电话一面类似,二面是HR面,谈及人才培养的时候说,我们认为能者多劳,所以有能力的人会当好几个同学的导师,言外之意是,人少,不能一个人一个导师。。印象一般吧,后来约cto面的时候在火车上,改天约。六、阿里(一轮游)阿里其实没什么说的,不怎么要人了,想着软件园那边有家饭馆想吃,就去了,一轮游很happy。因为自己的项目有推送功能所以主要问了怎么保持长连接,怎么选择是长连接还是短连接,怎么在长连接的时候尽可能降低功耗等,还有GC、jvm内部使用了什么数据结构以及循环引用,然后问道如果就要使用引用计数算法,怎么避免循环引用。就不能乖乖的用可达性算法么真是的=。=。。。
贴吧热议榜
使用签名档&&
保存至快速回贴&&&&&&& 安卓开发中ListView控件是一个使用频率相当的高级控件,通常用于展示一系列极高的数据,当数据量极大或布局相当复杂时,ListView的就显得非常重要。所以在开发中不但功能上要满足,而且在性能上也不能马虎。&&&&&&& 使用ListView是一个标准的适配器,ListView把数据、布局和Adapter有极地在一起完成一系列的展示功能。在ListView的数据展示中,每次ListView都会触发getView()方法的调用,并且XML定义的布局是在也是在适配器的getView()方法中使用布局加载器加载,LayoutInflater加载布局是件相当耗资源的事儿,又加之findViewById()方法是一个耗时的操作,由此看出频繁的inflater()和findViewById()操作会给应用带来相当严重的性能问题,所以ListView的性能优化是刻不容缓的,好在Google工程师已经为我们提供了相应的解决方案,ListView的缓存功能。&&&&&&&看之前先看看效果图:&&&&&&&下面就通过一个简单的Demo来诠释上面的描述。
package com.hitech.
import java.util.ArrayL
import java.util.L
import android.app.A
import android.os.B
import android.util.L
import android.view.V
import android.view.ViewG
import android.widget.BaseA
import android.widget.CheckB
import android.widget.ListV
import android.widget.TextV
public class MainActivity extends Activity {
public static final String TAG = "MainActivity";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.lv_activity_main);
listView.setAdapter(new ListAdapter());
private class ListViewDataAdapter extends BaseAdapter {
private List&String& list = new ArrayList&String&();
public ListViewDataAdapter() {
for (int i = 0; i & 100; i++) {
list.add(i + "");
public int getCount() {
return list.size();
public Object getItem(int position) {
return list.get(position);
public long getItemId(int position) {
public View getView(int position, View convertView, ViewGroup parent) {
View view =
ViewHolder holder =
if (convertView != null) {
// 如果convertView中有缓存
view = convertV
// 直接使用缓存并从中取出缓存的ViewHolder对象
holder = (ViewHolder) view.getTag();
Log.e(TAG, "使用缓存的convertView" + position);
Log.e(TAG, "没有缓存的convertView" + position);
// 如果没有缓存,就从加载布局
view = getLayoutInflater().inflate(
R.layout.dialog_popup_main_activity, null);
// 将加载布局中的控件缓存到ViewHolder中
holder = new ViewHolder();
holder.textview_username = (TextView) view
.findViewById(R.id.textview_username);
holder.textview_nickname = (TextView) view
.findViewById(R.id.textview_nickname);
holder.checkbox_selected = (CheckBox) view
.findViewById(R.id.checkbox_selected);
// 把holder对象做为数据存到view
view.setTag(holder);
// 对布局中的控件进行设置 由于
holder.textview_nickname.setText(list.get(position));
holder.textview_username.setText(list.get(position));
holder.checkbox_selected.setText(list.get(position));
public static class ViewHolder {
// 对布局文件中的控件按面向对象思想封装
TextView textview_username =
TextView textview_nickname =
CheckBox checkbox_selected =
没有下一篇了!ListView 使用 ViewHolder
我的图书馆
ListView 使用 ViewHolder
Adapter是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。如果列表中有很多的项时会占用极大的系统资源,所以我们需要优化Adapter
1、convertView的使用
[java] Java代码&&&public&View&getView(int&position,&View&convertView,&ViewGroup&parent)&{&&&ViewHolder&&&&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&convertV&&&}&&&static&class&ViewHolder&{&&&private&TextView&&&&private&ImageView&&&&}&&&Java代码
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
//加载ListView item的布局文件
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);
* 利用holder,调用convertView.setTag函数
* 使得convertView创建的内存地址,不为空。
* 然后调用getTag来获得当前位置的tag
* 最后利用holder的各种set操作来替换当前位置的tag。
convertView.setTag(holder);
holder = (ViewHolder) convertView.getTag();
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertV
static class ViewHolder {
private TextV
private ImageV
上面这种方式对于每个View使用了一个ViewHolder来控制其内部的子item还使用了setTag和getTag的方法 将holder绑定到了view上而不是直接的新建View 是对Adapter的优化。
2、测试getView被调用的次数
假设做一个动态刷新的ListView,发现显示的adapter.notifyDataSetChanged()的速度有点慢 那么可以测试下getView调用的次数 是不是太多。调用的次数多的让你觉着莫名其妙 那么说明 肯定是有问题的 一定会影响性能的。
更改方法:
[html] &android:id="@+id/list"&&&android:layout_width="fill_parent"&&&android:layout_height="wrap_content"&&&&&ListView android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /&
将android:layout_height="wrap_content"修改成:android:layout_height="fill_parent"就可以了。
如果更改以后没用,ListView周围的控件也是"wrap_content"那么也需要修改。
3、关于ListView 对于纯色的item背景 其实可以直接设置BackgroundColor 而不要使用图片 这一部分其实可以有不小的提升 同样的 对于任何纯色的背景 应该尽量去设置RGB颜色 而不是全用一张图片做背景。
TA的最新馆藏[转]&}

我要回帖

更多关于 adapter viewholder 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信