`

如何让Android ListView的平滑滚动

阅读更多

 

原文链接:http://android.eoe.cn/topic/ui

 

让 ListView 平滑滚动的关键在于将程序的主线程(UI线程)从大量的处理中解脱出来。要要保证用单独的线程来进行磁盘,网络或SQL操作。想要测试你的程序的状态, 你可以开启**StrictMode** 。

使用后台线程


使用后台线程(“工作线程”)可移除主线程中德压力,以至于集中精力绘制UI。在很多案例中,利用 AsyncTask (异步任务)可以提供一种在主线程之外执行你的工作简单的方法。 AsyncTask'''自动将所有'_execute()) 请求排成队列并按顺序执行他们。这种行为对一个特定进程来说是全局性的,这意味着你不必担心创建自己的线程池。

下方所示的简单代码中,利用**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>() {
    private ViewHolder v;

    @Override
    protected Bitmap doInBackground(ViewHolder... params) {
        v = params[0];
        return mFakeImageLoader.getImage();
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        if (v.position == position) {
            // 如果该项还未被回收, 隐藏进度条,设置并显示图像
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    }}.execute(holder);

从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;
  ImageView icon;
  ProgressBar progress;
  int position;}

然后填充**findViewById())** 并且在布局中保存它。

1
2
3
4
5
6
ViewHolder holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
convertView.setTag(holder);

现在你可以轻松的访问每一个视图而不需要频繁的去查询他们,这节省了宝贵的处理器周期。

 

 
分享到:
评论

相关推荐

    Android中Listview的平滑滚动(smoothScrollToPositionFromTop方法)

    `smoothScrollToPositionFromTop`是Android ListView中实现平滑滚动的关键方法,它结合了动画效果和精确的定位,极大地提升了用户交互体验。在实际项目中,合理运用此方法,可以为应用增添专业且流畅的用户体验。

    Android 完美的listview自动循环滚动

    此外,为了使滚动更平滑,我们可能还需要关注ListView的缓存机制,以及适时调整滑动速度和动画效果。例如,可以通过修改`setSmoothScrollbarEnabled(true)`和`setScrollingCacheEnabled(false)`等属性来优化滚动体验...

    android listview 自动往上滚动

    2. **AbsListView#startSmoothScroll()**: 这是ListView的父类AbsListView提供的方法,用于启动平滑滚动。我们可以传入一个自定义的SmoothScroller实例,让它按需滚动到列表的顶部。 3. ** OverscrollEffect**: 在...

    Android ListView自动循环滚动

    创建一个Runnable对象,其中包含滚动逻辑,如调用ListView的`smoothScrollToPosition()`方法来平滑滚动到下一个位置。然后,将这个Runnable对象通过Handler的`postDelayed()`方法添加到消息队列中,设定一个合适的...

    android listView 适配器demo

    在实际项目中,你可能还会遇到性能优化的问题,例如ListView的滚动平滑性、内存使用等。这时,可以采用以下策略: - 使用convertView复用机制,减少视图创建。 - 在`getView()`中,避免不必要的数据计算和视图更新,...

    Android ListView滚动到指定的位置

    `smoothScrollToPosition(position)` 方法提供了平滑滚动的效果,使得ListView从当前位置平滑滚动到指定的`position`。这种方法更加用户体验友好,但需要注意的是,如果直接在主线程中调用,可能不会产生预期的滚动...

    android listview仿iphone特效

    这种效果通常包括但不限于平滑滚动、动态高度调整、渐变背景等,目的是提升Android应用的用户体验,使其更接近iOS的视觉风格。 在Android中,ListView是一个常用的控件,用于显示一列可滚动的项目列表。要实现...

    android listview左划删除

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的多行数据列表。"android listview左划删除"是ListView的一个常见扩展功能,允许用户通过手势左滑列表项来显示一个删除按钮,进而实现快速删除操作。这...

    android 横向滚动listview

    根据需求,可能还需要自定义滚动动画,如平滑滚动、弹性滚动等,这需要对滚动逻辑进行深入定制。 通过以上步骤,我们可以创建一个功能完备的横向滚动ListView。自定义组件虽然增加了开发工作量,但也带来了更高的...

    Android ListView一键置顶

    4. **平滑滚动**:`smoothScrollToPosition()`方法可以使ListView平滑地滚动到指定位置,而不是立即跳转,这样可以提供更流畅的用户体验。参数0表示滚动到列表的第一个位置。 5. **优化性能**:为了防止频繁的滚动...

    android listview 拖拽效果

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的多行数据列表。"android listview 拖拽效果"是指在ListView上实现的一项高级功能,允许用户通过手势拖动ListView中的每个条目(item)来改变它们的位置...

    Android横向列表,横向listview实现

    调用RecyclerView的`smoothScrollToPosition()`方法,可以实现平滑滚动到指定位置。 **四、TestHorizontalListView示例** `TestHorizontalListView`可能是一个包含上述实现的示例项目,包含了必要的XML布局文件、...

    listview自动滚动

    这里`smoothScrollBy()`方法用于平滑滚动,第一个参数是滚动的距离,第二个参数是滚动所需的时间。 2. 使用Runnable和postDelayed()实现自动滚动: ```java final Handler handler = new Handler(); private ...

    Android ListView使用技巧

    另外,开启`setSmoothScrollbarEnabled(true)`可以平滑滚动,提高用户感知。 9. **空视图(Empty View)** 当ListView没有数据时,可以显示一个空视图告知用户。在XML布局中,将空视图作为ListView的兄弟节点,...

    Android ListView 固定列头源码

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。在处理表格或者有列头的数据时,我们可能需要实现类似Excel那样固定列头的功能,以便用户在滚动内容时仍能清晰地看到列名。标题"Android ...

    listview textview水平滚动

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。然而,有时我们希望在ListView的每一项中包含的...只要保持`HorizontalScrollView`的子视图宽度总和不超过其宽度,就可以实现平滑的水平滚动效果。

    Android ListView上下翻页效果

    在Android开发中,ListView是用于显示大量数据列表的一个核心组件,它可以实现高效的滚动性能和自定义视图。本文将深入探讨如何在ListView中实现上下翻页效果,这通常涉及到数据加载策略、滚动监听以及适配器的巧妙...

    Android Listview 列表项删除动画Demo

    本示例"Android Listview 列表项删除动画Demo"旨在演示如何在ListView中实现一个动态效果:当用户选择删除某个列表项时,该条目会有一个从右向左滑动的动画效果,同时,下面的列表项会平滑地填补被删除项留下的空缺...

    AndroidListView侧栏字母条索引定位demo

    然后,使用ListView的`smoothScrollToPosition(int position)`方法平滑滚动到目标位置。 5. **实时更新**:为了提供更好的用户体验,可以在用户滚动ListView时,自动高亮当前显示范围内的首字母。这通常通过比较...

    android listview分组滑动悬浮

    4. **点击事件**:为悬浮条设置点击监听器,当用户点击悬浮条时,可以调用ListView的smoothScrollToPosition()方法,平滑滚动到相应的分组位置。 5. **动画效果**:为了提升用户体验,还可以添加一些过渡动画,比如...

Global site tag (gtag.js) - Google Analytics