【eoe资源】如何让Android ListView的平滑滚动(1)

下方所示的简单代码中,利用**AsyncTask** 在后台线程中加载图像,然后一旦完成便应用在UI中。也可以显示一个进度条来代替正在加载的图像。

 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// 利用AsyncTask在后台线程中加载缓慢的图像

new AsyncTask<ViewHolder, Void, Bitmap>() {

<span class="kd">private</span> <span class="n">ViewHolder</span> <span class="n">v</span><span class="o">;</span>



<span class="nd">@Override</span>

<span class="kd">protected</span> <span class="n">Bitmap</span> <span class="nf">doInBackground</span><span class="o">(</span><span class="n">ViewHolder</span><span class="o">...</span> <span class="n">params</span><span class="o">)</span> <span class="o">{<!-- --></span>

    <span class="n">v</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span>

    <span class="k">return</span> <span class="n">mFakeImageLoader</span><span class="o">.</span><span class="na">getImage</span><span class="o">();</span>

<span class="o">}</span>



<span class="nd">@Override</span>

<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onPostExecute</span><span class="o">(</span><span class="n">Bitmap</span> <span class="n">result</span><span class="o">)</span> <span class="o">{<!-- --></span>

    <span class="kd">super</span><span class="o">.</span><span class="na">onPostExecute</span><span class="o">(</span><span class="n">result</span><span class="o">);</span>

    <span class="k">if</span> <span class="o">(</span><span class="n">v</span><span class="o">.</span><span class="na">position</span> <span class="o">==</span> <span class="n">position</span><span class="o">)</span> <span class="o">{<!-- --></span>

        <span class="c1">// 如果该项还未被回收, 隐藏进度条,设置并显示图像</span>

        <span class="n">v</span><span class="o">.</span><span class="na">progress</span><span class="o">.</span><span class="na">setVisibility</span><span class="o">(</span><span class="n">View</span><span class="o">.</span><span class="na">GONE</span><span class="o">);</span>

        <span class="n">v</span><span class="o">.</span><span class="na">icon</span><span class="o">.</span><span class="na">setVisibility</span><span class="o">(</span><span class="n">View</span><span class="o">.</span><span class="na">VISIBLE</span><span class="o">);</span>

        <span class="n">v</span><span class="o">.</span><span class="na">icon</span><span class="o">.</span><span class="na">setImageBitmap</span><span class="o">(</span><span class="n">result</span><span class="o">);</span>

    <span class="o">}</span>

<span class="o">}}.</span><span class="na">execute</span><span class="o">(</span><span class="n">holder</span><span class="o">);</span>

从Android3.0(API Level 11)起,在** AsyncTask** 中可以使用一项新的功能,你可以通过开启它来

在多处理器内核间交叉运行线程。除了调用** execute())**方法,你可以使用**executeOnExecutor())** 方法而同时执行多个请求,而这取决于可用的核心数量。

在View Holder中保存视图对象


你的代码可能在滑动** ListView**时频繁地调用**findViewById())**,而这可使效果变慢。即使在**Adapter**为了回收而返回一个已经展现出来的视图,你仍然需要查找这些元素并且更新他们。一个循环使用**findViewById())** 的方法是使用“view holder”设计模式。

一个**findViewById())** 对象存储布局内的每个组建视图的标记域,你可以立即访问而不需要反复的查询他们。首先,你需要建立一个类来保存具体的视图。例如:

1

2

3

4

5

6

static class ViewHolder {
   
   

TextView text;

TextView timestamp;

如果你进阶的路上缺乏方向,可以加入我们的圈子和安卓开发者们一起学习交流!

  • Android进阶学习全套手册

    img

  • Android对标阿里P7学习视频

    img

  • BATJ大厂Android高频面试题

    img

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:

人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值