当前位置:文档之家› Android应用开发小贴士[1]

Android应用开发小贴士[1]

eclipse自动补全的设置

如果你用过Visual Studio的自动补全功能后,再来用eclipse的自动补全功能,相信大家会有些许失望。

但是eclipse其实是非常强大的,eclipse的自动补全没有VS那么好是因为eclipse的补全功能用的是默认设置。你只需要稍微修改一下就行了。

最简单的修改方式是:Windows——>Preferences——>Java-->Editor-->Content Asist,在Auto activation triggers for Java后面的文本框里只有一个“.”。现在你将其改为“.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”即可。然后你再试试,会发现,现在的补全功能跟VS差不多了。你还可以在Advanced和Favorite 里进行高级的设置。

将Auto Activation Delay 修改为400,可以处理输入“R.id.”当输入R. 后自动不全不需要的代码的问题。

自定义eclipse快捷键

发表回复

大家有木有发现,尽管eclipse的快捷键很多,但是仍然有很多常用操作没有快捷键,比如:跳过所有的断点、删除所有的断点等。但是后来才发现其实eclipse有很多操作可以有快捷键,但是默认没有提供,我们可以通过自定义eclipse快捷键的方式来满足自己的高效coding 和debug的需求。

自定义快捷键意味着,可以添加可以添加的快捷键,同时也可以修改快捷键(如果你对某快捷键不爽的话)。

自定义eclipse快捷键的步骤

下面介绍下eclipse快捷键的配置方法,如下图所示:

自定义eclipse快捷键

在Windows–>Perferences–>General–>Keys里面可以设置所有eclipse的快捷键。打开可以看到只是部分的功能有快捷键,还有不少的功能没有快捷键,这些快捷键都可以自定义,比如要设置ctrl+shift+1为跳过所有断点,可以先在命令过滤文本框里面输入想要设置的命令或者操作的英文名称(这个需要意会了,比如调试相关的命令,可以输入“breakpoint”,就能找到,如果实在不知道叫啥,就拖动滚动条一个个的看吧),跳过所有断点肯定是和breakpoint有关,所以输入breakpoint,可以看到列表里面有了所有和断点相关的命令,选择“Skip All Breakpoint”,然后在“Binding”里面按下ctrl+shift+1,再在“When”里面选择“In Windows”即可。

快捷键的上下文(Context)

其中“When”是告诉你,你设置的快捷键的会在什么场景下可用,或者说上下文是什么,In windows表示所有窗口,该快捷键的命令都会执行。这个上下文的还有个继承的潜规则:

?In Dialogs and Windows

?In Windows (extends In Dialogs and Windows)

?In Dialogs (extends In Dialogs and Windows)

?Editing Text (extends In Windows)

?Editing Java Source (extends Editing Text)

?Debugging (extends In Windows)

?Debugging Java (extends Debugging)

Schema

从上面的图片中可以看到快捷键设置中可以选择schema,默认的schema是Default,其实eclipse自带了emacs版的快捷键,喜欢emacs的同学可以使用这个schema。其中也有个潜规则,就是emacs schema继承了Default schema的快捷键,如果emacs的快捷键在Default中也有,那么emacs的快捷键优先级高,会覆盖Default的快捷键。

个人经验

想必不少人设置快捷键的时候担心会和其他快捷键冲突,所以不知道应该把某命令设置成什么快捷键。其实这个问题还好说,因为“Conflict”里面会告诉你你当前设置的快捷键和那些其他快捷键在什么场景上下文下冲突。经过我自己的测试,我发现一些的9个组合基本没有被eclipse使用到,大家可以放心设置自己的快捷键。即ctrl+shift+1~9,,希望能对大家提供参考。

Reference

eclipse的帮助文档快捷键章节:Help–>Workbench User

Guide–>Reference–>Perferences–>Keys

原创文章,转载请注明:转载自戎码一生

本文链接地址:自定义eclipse快捷键

eclipse中文字体大小修改,让中英文字体协调

发表回复

貌似有不少人苦恼eclipse中文字体大小修改问题,默认的eclipse中文字体很小,和英文字体大小完全不在一个调子上,因为默认的eclipse juno中英文字体是Consolas,字体大小是10,但是大家会发现,如果代码中有中文,那中文的字体会比英文的字体小很多,如下图:

明显的,默认的eclipse juno中英文字体比中文字体大很多,显得中文很模糊——eclipse

中文字体大小修改

如果大家把字体调大到中文字体看起来正常的话,那么英文字体就太大了,显得很不协调。网上也有一些方案,但是我觉得明显过于复杂,其实有很简单的办法,一步就可以搞定的。步骤如下:Window –> Preferences –> General –> Appearance –> Colors and Fonts,在“Colors and Fonts”中选择“Basic”–>”Text Font”,然后点“Edit”,此时只需要把“大小”里面的值编辑成“小五”即可。当你填入“小五”后,你会看到“大小”那一栏的下拉框中都变成了宋体的字体大小了,当然你也可以选择“五号”、“小四”、“四号”等等其他更大的字体。如下图:

把eclipse的字体大小设置成“小五”就可以把中文字体调大了

然后点“确定”,再点“Apply”,“OK”,你就可以看到eclipse中文字体变大了,英文字体和大小不变(因为宋体的小五的英文字体大小正好和英文的10是相等的)。你可以通过把大小设置成宋体大小的更大值来同时调整中文英文的大小,这种设置方法可以让中英文字体协调美观。调整后的效果如下图:

eclipse的字体大小修改成小五后中英文字体明显协调多了

相信这个方法应该比网上的其他修改eclipse中文字体的方法来得更直接更简单吧。

eclipse最有用快捷键整理

在网上搜eclipse快捷键,可以搜出一大堆,大多罗列了n多的快捷键,估计大部分人看了以后都会头大的,我也头大,不过我一一尝试了一遍,整理出了最常用最有用,写代码必须用到的一些快捷键,大约只有网上快捷键大全的一半,减少大家的记忆量。如果大家把这些快捷键都很好的运用,写代码的效率一定会有提高。当然你也可以通过菜单栏中

Window–>Preferences–>General–>Keys来查看和修改快捷键绑定。

编辑

Ctrl+1 快速修复(最经典的快捷键,就不用多说了,可以解决很多问题,比如import类、try catch包围等)

Ctrl+Shift+F 格式化当前代码

Ctrl+Shift+M 添加类的import导入

Ctrl+Shift+O 组织类的import导入(既有Ctrl+Shift+M的作用,又可以帮你去除没用的导入,很有用)

Ctrl+Y 重做(与撤销Ctrl+Z相反)

Alt+/ 内容辅助(帮你省了多少次键盘敲打,太常用了)

Ctrl+D 删除当前行或者多行

Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)

Alt+↑ 当前行和上面一行交互位置(同上)

Ctrl+Alt+↓ 复制当前行到下一行(复制增加)

Ctrl+Alt+↑ 复制当前行到上一行(复制增加)

Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)

Ctrl+/ 注释当前行,再按则取消注释

选择

Alt+Shift+↑ 选择封装元素

Alt+Shift+← 选择上一个元素

Alt+Shift+→ 选择下一个元素

Shift+← 从光标处开始往左选择字符

Shift+→ 从光标处开始往右选择字符

Ctrl+Shift+← 选中光标左边的单词

Ctrl+Shift+→ 选中光标又边的单词

Ctrl+← 光标移到左边单词的开头,相当于vim的b

Ctrl+→ 光标移到右边单词的末尾,相当于vim的e

搜索

Ctrl+K 参照选中的Word快速定位到下一个(如果没有选中,则搜索上一次使用搜索的word)

Ctrl+Shift+K 参照选中的Word快速定位到上一个

Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在状态栏中显示没有找到了,查一个单词时,特别实用,要退出这个模式,按escape建)

Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)

Ctrl+Shift+U 列出所有包含字符串的行

Ctrl+H 打开搜索对话框

Ctrl+G 工作区中的声明

Ctrl+Shift+G 工作区中的引用

导航

Ctrl+Shift+T 搜索类(包括工程和关联的第三jar包)

Ctrl+Shift+R 搜索工程中的文件

Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)

F4 打开类型层次结构

F3 跳转到声明处

Alt+← 前一个编辑的页面

Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)

调试

F5 单步跳入

F6 单步跳过

F7 单步返回

F8 继续

Ctrl+Shift+D 显示变量的值

Ctrl+Shift+B 在当前行设置或者去掉断点

Ctrl+R 运行至行

(一般重构的快捷键都是Alt+Shift开头的了)

Alt+Shift+R 重命名方法名、属性或者变量名(是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)

Alt+Shift+M 把一段函数内的代码抽取成方法(这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)

Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)

Alt+Shift+L 抽取本地变量(可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)

Alt+Shift+F 把Class中的local变量变为field变量(比较实用的功能)

Alt+Shift+I 合并变量(可能这样说有点不妥Inline)

Alt+Shift+V 移动函数和变量(不怎么常用)

Alt+Shift+Z 重构的后悔药(Undo)

其他

Alt+Enter 显示当前选择资源的属性,windows下的查看文件的属性就是这个快捷键,通常用来查看文件在windows中的实际路径

Ctrl+↑ 文本编辑器上滚行

Ctrl+↓ 文本编辑器下滚行

Ctrl+M 最大化当前的Edit或View (再按则反之)

Ctrl+O 快速显示OutLine(不开Outline窗口的同学,这个快捷键是必不可少的)

Ctrl+T 快速显示当前类的继承结构

Ctrl+W 关闭当前Editer(windows下关闭打开的对话框也是这个,还有qq、旺旺、浏览器等都是)

Ctrl+L 文本编辑器转至行

F2 显示工具提示描述

原创文章,转载请注明:转载自戎码一生

本文链接地址:eclipse最有用快捷键整理

搞清楚这些问题对于编写出能正确响应UI操作的代码是很重要的,尤其当屏幕上的不同View需要针对此次UI操作做出各种不同响应的时候更是如此,一个典型例子就是用户在桌面上放置了一个Widget,那么当用户针对widget做各种操作时,桌面本身有的时候要对用

户的操作做出响应,有时忽略。只有搞清楚事件触发和传递的机制才有可能保证在界面布局非常复杂的情况下,UI控件仍然能正确响应用户操作。

AD:51CTO学院:IT精品课程在线看!

针对屏幕上的一个View控件,Android如何区分应当触发onTouchEvent,还是onClick,亦或是onLongClick事件?

在Android中,一次用户操作可以被不同的View按次序分别处理,并将完全响应了用户一次UI操作称之为消费了该事件(consume),那么Android是按什么次序将事件传递的呢?又在什么情况下判定为消费了该事件?

搞清楚这些问题对于编写出能正确响应UI操作的代码是很重要的,尤其当屏幕上的不同View需要针对此次UI操作做出各种不同响应的时候更是如此,一个典型例子就是用户在桌面上放置了一个Widget,那么当用户针对widget做各种操作时,桌面本身有的时候要对用户的操作做出响应,有时忽略。只有搞清楚事件触发和传递的机制才有可能保证在界面布局非常复杂的情况下,UI控件仍然能正确响应用户操作。

1. onTouchEvent

onTouchEvent中要处理的最常用的3个事件就是:ACTION_DOWN、ACTION_MOVE、ACTION_UP。

这三个事件标识出了最基本的用户触摸屏幕的操作,含义也很清楚。虽然大家天天都在用它们,但是有一点请留意,ACTION_DOWN事件作为起始事件,它的重要性是要超过ACTION_MOVE和ACTION_UP的,如果发生了ACTION_MOVE或者ACTION_UP,那么一定曾经发生了ACTION_DOWN。

从Android的源代码中能看到基于这种不同重要性的理解而实现的一些交互机制,SDK 中也有明确的提及,例如在ViewGroup的onInterceptTouchEvent方法中,如果在ACTION_DOWN事件中返回了true,那么后续的事件将直接发给onTouchEvent,而不是继续发给onInterceptTouchEvent。

2. onClick、onLongClick与onTouchEvent

曾经看过一篇帖子提到,如果在View中处理了onTouchEvent,那么就不用再处理onClick了,因为Android只会触发其中一个方法。这个理解是不太正确的,针对某个view,用户完成了一次触碰操作,显然从传感器上得到的信号是手指按下和抬起两个操作,我们可以理解为一次Click,也可以理解为发生了一次ACTION_DOWN和ACTION_UP,那么Android 是如何理解和处理的呢?

在Android中,onClick、onLongClick的触发是和ACTION_DOWN及ACTION_UP相关的,在时序上,如果我们在一个View中同时覆写了onClick、onLongClick及onTouchEvent的话,onTouchEvent是最先捕捉到ACTION_DOWN和ACTION_UP事件的,其次才可能触发onClick 或者onLongClick。主要的逻辑在View.java中的onTouchEvent方法中实现的:

1.case MotionEvent.ACTION_DOWN:

2. mPrivateFlags |= PRESSED;

3. refreshDrawableState();

4.if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {

5. postCheckForLongClick();

6. }

7.break;

8.case MotionEvent.ACTION_UP:

9.if ((mPrivateFlags & PRESSED) != 0) {

10.boolean focusTaken = false;

11.if (isFocusable() && isFocusableInTouchMode() && !isFocused

()) {

12. focusTaken = requestFocus();

13. }

14.if (!mHasPerformedLongPress) {

15.if (mPendingCheckForLongPress != null) {

16. removeCallbacks(mPendingCheckForLongPress);

17. }

18.if (!focusTaken) {

19. performClick();

20. }

21. }

22.…

23.break;

可以看到,Click的触发是在系统捕捉到ACTION_UP后发生并由performClick()执行的,performClick里会调用先前注册的监听器的onClick()方法:

1.public boolean performClick() {

2.…

3.if (mOnClickListener != null) {

4. playSoundEffect(SoundEffectConstants.CLICK);

5. mOnClickListener.onClick(this);

6.return true;

7. }

8.return false;

LongClick的触发则是从ACTION_DOWN开始,由postCheckForLongClick()方法完成:

1.private void postCheckForLongClick() {

2. mHasPerformedLongPress = false;

3.if (mPendingCheckForLongPress == null) {

4. mPendingCheckForLongPress = new CheckForLongPress();

5. }

6. mPendingCheckForLongPress.rememberWindowAttachCount();

7. postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLon

gPressTimeout());

8.}

可以看到,在ACTION_DOWN事件被捕捉后,系统会开始触发一个postDelayed操作,delay 的时间在Eclair2.1上为500ms,500ms后会触发CheckForLongPress线程的执行:

1.class CheckForLongPress implements Runnable {

2.

3.…

4.public void run() {

5.if (isPressed() && (mParent != null)

6. && mOriginalWindowAttachCount == mWindowAttachCo

unt) {

7.if (performLongClick()) {

8. mHasPerformedLongPress = true;

9. }

10. }

11. }

12.…

13.}

如果各种条件都满足,那么在CheckForLongPress中执行performLongClick(),在这个方法中将调用onLongClick():

1.public boolean performLongClick() {

2.…

3.if (mOnLongClickListener != null) {

4. handled = mOnLongClickListener.onLongClick(View.this);

5. }

6.…

从实现中可以看到onClick()和onLongClick()方法是由ACTION_DOWN和ACTION_UP事件捕捉后根据各种情况最终确定是否触发的,也就是说如果我们在一个Activity或者View 中同时监听或者覆写了onClick(),onLongClick()和onTouchEvent()方法,并不意味着只会发生其中一种。

下面是一个onClick被触发的基本时序的Log:

04-05 05:57:47.123: DEBUG/TSActivity(209): onTouch ACTION_DOWN

04-05 05:57:47.263: DEBUG/TSActivity(209): onTouch ACTION_UP

04-05 05:57:47.323: DEBUG/TSActivity(209): onClick

可以看出是按ACTION_DOWN -> ACTION_UP -> onClick的次序发生的。

下面是一个onLongClick被触发的基本时序的Log:

04-05 06:00:04.133: DEBUG/TSActivity(248): onTouch ACTION_DOWN

04-05 06:00:04.642: DEBUG/TSActivity(248): onLongClick

04-05 06:00:05.083: DEBUG/TSActivity(248): onTouch ACTION_UP

可以看到,在保持按下的状态一定时间后会触发onLongClick,之后抬起手才会发生ACTION_UP。

3. onClick和onLongClick能同时发生吗?

要弄清楚这个问题只要理解Android对事件处理的所谓消费(consume)概念即可,一个用户的操作会被传递到不同的View控件和同一个控件的不同监听方法处理,任何一个接收并处理了该次事件的方法如果在处理完后返回了true,那么该次event就算被完全处理了,其他的View或者监听方法就不会再有机会处理该event了。

onLongClick的发生是由单独的线程完成的,并且在ACTION_UP之前,而onClick 的发生是在ACTION_UP后,因此同一次用户touch操作就有可能既发生onLongClick又发生onClick。这样是不是不可思议?所以及时向系统表示“我已经完全处理(消费)了用户的此次操作”,是很重要的事情。例如,我们如果在onLongClick()方法的最后return true,那么onClick事件就没有机会被触发了。

下面的Log是在onLongClick()方法return false的情况下,一次触碰操作的基本时序:

04-05 06:00:53.023: DEBUG/TSActivity(277): onTouch ACTION_DOWN

04-05 06:00:53.533: DEBUG/TSActivity(277): onLongClick

04-05 06:00:55.603: DEBUG/TSActivity(277): onTouch ACTION_UP

04-05 06:00:55.663: DEBUG/TSActivity(277): onClick

可以看到,在ACTION_UP后仍然触发了onClick()方法。

本文链接地址:https://www.doczj.com/doc/6f12244997.html,/aprogram-390690.htm

2. 上拉载入更多组件是Footer,为了确保这个footer在最后(可能会添加多个自定义footer),在用户调用setAdatper的时候再把这个footer塞进去。

3. 覆写ListView的onTouchEvent方法,处理各种情况。

4. 用户松手,启动mScroller,将header、footer回滚到所需状态。

5. 添加了用户下拉、上拉移动delay的效果,类似iOS的行为。

6. 提供了两个接口:

a) IXListViewListener: 触发下拉刷新、上拉载入更多

b) OnXScrollListener: 这个和原生的OnScrollListener一样,但是在mScroller回滚时,也会触发这里的事件。

碰到的问题:

1. 用户下拉回推时,不断修改header的高度,但这时候滚动条指示器的位置还是按老的高度计算的,需要强制调用一下setSelection(0)将ListView滚动到顶部。

下拉刷新

上拉刷新

示例https://www.doczj.com/doc/6f12244997.html,/download/hujm123/7191655 Android之ListView原理学习与优化总结

2012-06-06 10:36:12

标签:ListView Android

原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。https://www.doczj.com/doc/6f12244997.html,/1823534/889879

在整理前几篇文章的时候有朋友提出写一下ListView的性能优化方面的东西,这个问题也是小马在面试过程中被别人问到的…..今天小马就借此机会来整理下,网上类似的资料蛮多的,倒不如自己写一篇,记录在这个地方,供自己以后使用,不用再翻来翻去的找了,用自己写的…

呵呵,不多讲其它了,说起优化我想大家第一反应跟小马一样吧?想到利用ViewHolder来优化ListView数据加载,仅仅就此一条吗?其实不是的,首先,想要优化ListView就得先了解ListView加载数据原理,这是前提,但是小马在这个地方先做一些简单的补充,大家一定仔细看下,保证会有收获的:

列表的显示需要三个元素:

1.ListVeiw: 用来展示列表的View。

2.适配器: 用来把数据映射到ListView上

3.数据:具体的将被映射的字符串,图片,或者基本组件。

根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,这三种适配器的使用大家可学习下官网上面的使用或者自行百度谷歌,一堆DEMO!!!其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是

SimpleAdapter对数据库的简单结合,可以方便的把数据库的内容以列表的形式展示出来。

系统要绘制ListView了,他首先用getCount()函数得到要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(这个看实际情况,如果是一个简单的显示则是View,如果是一个自定义的里面包含很多控件的时候它其实是一个ViewGroup),然后再实例化并设置各个组件及其数据内容并显示它。好了,绘制完这一行了。那再绘制下一行,直到绘完为止,前面这些东西做下铺垫,继续…….

现在我们再来了解ListView加载数据的原理,有了这方面的了解后再说优化才行,下面先跟大家一起来看下ListView加载数据的基本原理小马就直接写了:

ListView的工作原理如下:

ListView 针对每个item,要求 adapter “返回一个视图” (getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到ListView的长度,然后根据这个长度,调用getView()一行一行的绘制ListView的每一项。如果你的getCount()返回值是0的话,列表一行都不会显示,如果返回1,就只显示一行。返回几则显示几行。如果我们有几千几万甚至更多的item要显示怎么办?为每个Item创建一个新的View?不可能!!!实际上Android早已经缓存了这些视图,大家可以看下下面这个截图来理解下,这个图是解释ListView工作原理的最经典的图了大家可以收藏下,不懂的时候拿来看看,加深理解,其实Android中有个叫做Recycler的构件,顺带列举下与Recycler相关的已经由Google 做过N多优化过的东东比如:AbsListView.RecyclerListener、ViewDebug.RecyclerTraceType等等,要了解的朋友自己查下,不难理解,下图是ListView加载数据的工作原理(原理图看不清楚的点击后看大图):

下面简单说下上图的原理:

1.如果你有几千几万甚至更多的选项(item)时,其中只有可见的项

目存在内存(内存内存哦,说的优化就是说在内存中的优化!!!)中,其他的在Recycler中

2.ListView先请求一个type1视图(getView)然后请求其他可见的

项目。convertView在getView中是空(null)的

3.当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,

ListView再请求一个type1视图。convertView此时不是空值了,它的

值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图

下面来看下小马从网上找来的示例代码,网址搞丢了,只有一个word文档,只能 copy过来,不然直接贴网址,结合上面的原理图一起加深理解,如下:

1.public class MultipleItemsList extends ListActivity{

2.

3.private MyCustomAdapter mAdapter;

4.

5.@Override

6.public void onCreate(Bundle savedInstanceState){

7.super.onCreate(savedInstanceState);

8.mAdapter=new MyCustomAdapter();

9.for(int i=0;i<50;i++){

10.mAdapter.addItem("item"+i);

11.}

12.setListAdapter(mAdapter);

13.}

14.

15.private class MyCustomAdapter extends BaseAdapte

r{

16.

17.private ArrayList mData=new ArrayList();

18.private LayoutInflater mInflater;

19.

20.public MyCustomAdapter(){

21.mInflater=(LayoutInflater)getSystemSe

rvice(https://www.doczj.com/doc/6f12244997.html,YOUT_INFLATER_SERVICE);

22.}

23.

24.public void addItem(final String item){

25.mData.add(item);

26.notifyDataSetChanged();

27.}

28.

29.@Override

30.public int getCount(){

31.return mData.size();

32.}

33.

34.@Override

35.public String getItem(int position){

36.return mData.get(position);

37.}

38.

39.@Override

40.public long getItemId(int position){

41.return position;

42.}

43.

44.@Override

45.public View getView(int position,View conve

rtView,ViewGroup parent){

46.System.out.println("getView"+positio

n+""+convertView);

47.ViewHolder holder=null;

48.if(convertView==null){

49.convertView=mInflater.inflate(R.l

ayout.item1,null);

50.holder=new ViewHolder();

51.holder.textView=(TextView)convert

View.findViewById(R.id.text);

52.convertView.setTag(holder);

53.}else{

54.holder=(ViewHolder)convertView.ge

tTag();

55.}

相关主题
文本预览
相关文档 最新文档