如何在 ListView 中实现 Android 4.0 之类的滑动以关闭功能?

Posted

技术标签:

【中文标题】如何在 ListView 中实现 Android 4.0 之类的滑动以关闭功能?【英文标题】:How to implement Android 4.0 like swipe to dismiss functionality in ListView? 【发布时间】:2012-03-16 05:12:24 【问题描述】:

我正在开发一个应用程序,我想在其中实现 ListView 中的滑动关闭功能 - 类似于我们在 android 4.0 的通知栏、最近应用程序列表或浏览器选项卡中看到的内容。我想在运行 Android 2.2+ 的设备上运行该应用程序。请参见下图。我还想更改被滑动项目的透明度 - 就像在 ICS 中一样。

我在http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.1_r1/com/android/browser/TabScrollView.java?av=f 上检查了 ICS 网络浏览器的源代码,但无法确定哪个类特别负责实现此功能。

任何人都可以在这里指出正确的方向吗?我们可以使用 Android 兼容性库来做到这一点吗?请告诉我。非常感谢。

【问题讨论】:

【参考方案1】:

我也想过实现这样的功能,但我还没有做到。所以我唯一能提供的是关于如何解决这个问题的一些想法。如果我最终写了一些代码,我会在这里发布。

    所需的主要类是一个自定义适配器,它扩展了 ListAdapter(ArrayAdapter、SimpleCursorAdapter 等)。 适配器将 View.OnTouchListener 应用于其所有视图。 只要监听器检测到水平滚动dx,它就会调用concernedView.offsetLeftAndRight(dx)(这将使视图可拖动)。当然,适配器必须保存视图的当前水平偏移量。如果用户正在拖动视图并将他/她的手指从屏幕上移开,则 touchListener 也会检测到这一点并开始滑回动画。使用当前的偏移量,我们还可以计算一个 alpha 值,这样视图会在接近屏幕边框时淡出。 如果一个列表条目最终被用户关闭,它会变得有点棘手,我仍然不确定如何执行以下操作:列表内容必须更新(或者适配器必须忽略被驳回的条目)并且低于被驳回的视图必须向上悬停以填补空白。我认为让 ListView 加载新内容可能会起作用,但这会立即填补空白。为了避免这种情况,我会启动一个动画,让所有相关视图从它们的旧位置(我们仍然有间隙)悬停回到它们的当前位置(填充间隙)。

这些只是我对这个问题的一些想法,可能会帮助一些人开始解决这个问题。就像我说的,我可能会在未来的某个时候实现它,当然我会在这里发布代码。 我会感谢 cmets 的任何反馈,但我不想彻底解释我的想法的每一个方面,这会花费我太多时间;)

【讨论】:

嗯,这是一个开始。我会尝试基于此创建一些东西,如果成功,我会在此处更新。 在删除视图之前,将其高度设置为 0。这将使列表很好地折叠。那么通知就不会是一个不和谐的快照。【参考方案2】:

我知道这是一个很老的问题,但是对于仍在寻找这个问题的任何人,您可以在这里查看 Roman Nurik 的图书馆:https://github.com/romannurik/Android-SwipeToDismiss

这显示了如何为列表视图和普通视图创建所需的行为。

【讨论】:

以上是关于如何在 ListView 中实现 Android 4.0 之类的滑动以关闭功能?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中实现自定义 ListView

Android在滚动列表中实现视频的播放 ListView RecyclerView

如何在 ListView 中实现删除按钮并从数据库中删除?

在android的listview中实现音频播放器

如何使用edittexts在自定义ListView中实现监听器文本更改?

Android 中实现模拟搜索的功能详解