当 ArrayAdapter.isEnabled 返回 false 时,ListView 中的分隔符消失
Posted
技术标签:
【中文标题】当 ArrayAdapter.isEnabled 返回 false 时,ListView 中的分隔符消失【英文标题】:Disappearing divider in ListView when ArrayAdapter.isEnabled returns false 【发布时间】:2011-07-19 12:13:32 【问题描述】:我将ListActivity
与我自己的ArrayAdapter
课程一起使用。当我覆盖 ArrayAdapter.areAllItemsEnabled()
和 ArrayAdapter.isEnabled()
方法时,列表视图中某些单元格之间的分隔符消失了。有谁知道如何避免这种情况?即使对于禁用的单元格,我也需要显示分隔符。
【问题讨论】:
【参考方案1】:在 areAllItemsEnabled() 中返回 true,在 isEnabled 中为特定项目返回 false。禁用的项目将无法点击,但您仍然可以查看分隔线
注意:这不适用于 android 5
【讨论】:
传奇!一直在寻找一种方法来做到这一点 非常感谢!这正是我想要的! @sstn 你能详细说明一下吗? 5.0有更好的解决方案吗? @DanielWilson 我现在的解决方法是将分隔符设置为 null 并显式地将分隔符插入到适配器的数据集中(至少虚拟地)。它非常难看,因为您需要另一种视图类型、实际数据更改的索引等。我相信这是源树中改变行为的更改:android.googlesource.com/platform/frameworks/base/+/… 哇,那里正在发生一些严重的旗帜地狱。为什么他们认为我们不想要禁用项目之间的分隔符?似乎它至少应该是一种选择。它应该默认显示它们。【参考方案2】:您基本上可以通过为列表项中的任何一个元素赋予以下属性来禁用列表项。
android:focusable="true"
android:clickable="true"
因此下面的列表项布局将不可点击,但会显示分隔线,无需实现areAllItemsEnabled()
或isEnabled(int position)
。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_
android:layout_
android:focusable="true"
android:clickable="true">
<TextView
android:text="Large Text"
android:layout_
android:layout_/>
</LinearLayout>
这在原来的答案似乎不再适用的 Android 5.0 中可能会有所帮助。
【讨论】:
确认这适用于 4.0.4、4.4.4 和 5.1.1。谢谢! 似乎足以设置focusable true【参考方案3】:这对我有用。这将显示分隔线并禁用单击列表项。即使在 Android 5.0 中。
在列表项上设置此项
android:focusable="true"
android:clickable="false"
将可点击设置为“假”对我不起作用。 并且覆盖 isEnabled() 导致上述在 5.0 中隐藏分隔符的问题。
我的 ListView 看起来像这样。
<ListView
android:id="@+id/lvItems"
android:layout_
android:layout_
android:divider="@color/Gray"
android:dividerHeight="1px">
</ListView>
这里不需要android:listSelector="@android:color/transparent"
【讨论】:
【参考方案4】:上述所有解决方案都存在兼容性问题(在一个版本的 Android 上运行良好,但在另一个版本上失败) - 特别是如果您想使用透明度。唯一真正强大的解决方案是使用 nine-patch 文件。
您可以从:http://ge.tt/517ZIFC2/v/1?c下载
只需将选中的 png 放到 drawable-nodpi
目录即可避免重采样。
并在您的适配器中使用它:
convertView.setBackgroundResource(R.drawable.border_b1px_black);
【讨论】:
【参考方案5】:对于 Android 5.0 及更高版本,您必须启用 isEnabled() 方法中的行。
但您仍然可以通过其他方式禁用行:
在以下示例中,我将禁用除第 0 行之外的每一行:
在适配器的 getView 方法中:
if (position > 0)
convertView.setClickable(true);
由于某种原因,将 clickable 设置为 true 会禁用该行。我不确定为什么。起初我以为这会使它可以点击,但事实并非如此。
参考:Android ListView child View setEnabled() and setClickable() do nothing
查看 user622689 的回答。
【讨论】:
您需要确保在 else 语句中将 clickable 设置为 false - 否则由于视图回收,随机列表项将无法点击【参考方案6】:不是设置isEnabled
,而是设置ListView
,设置android:listSelector="@android:color/transparent"
以及android:focusable="true"
和
android:clickable="true"
。效果是一样的
【讨论】:
我发现这是最好的解决方法,因为您不需要添加额外的代码来修改您的列表项。如果您的列表视图中有一些项目的项目单击侦听器,则需要在其中添加防御代码以忽略对禁用项目的单击,仅此而已。【参考方案7】:我可以验证当 areAllItemsEnabled()
返回 false 时,对于您想通过 isEnabled(int position)
设置为不可选择的每个特定行,行分隔符(分隔符)会消失。将areAllItemsEnabled()
设置为始终返回true,并且只使用isEnabled(int position)
应该使特定行不可选择,并且分隔线显示得很好。
【讨论】:
【参考方案8】:使用列表视图的setDivider(Drawable divider)
方法
【讨论】:
感谢您的回答。我试图设置分隔线,但问题仍然存在。我发现当 ArrayAdapter.areAllItemsEnabled() 和 ArrayAdapter.isEnabled() 方法都返回“false”时,分隔符消失。你有什么想法,如何解决我的问题。提前致谢。【参考方案9】:我在 Lollipop 上遇到了同样的问题。对我来说,解决方法是将列表视图中的背景更改为透明。在我的情况下,当我将背景设置为颜色时,我在 isEnabled
返回 false 的行上缺少导航抽屉上的分隔线。尝试类似:
android:background="@android:color/transparent"
【讨论】:
【参考方案10】:我遇到了类似的问题。我通过将列表视图的分隔高度显式设置为“1dp”解决了这个问题
<ListView
android:id="@+id/listView"
android:layout_
android:layout_
android:dividerHeight="1dp"
/>
【讨论】:
【参考方案11】:要真正模拟一个禁用的项目,在适配器的 getView 中,layout = (your return value)
:
if ( ! YOUR_ITEM_REF?.isEnabled())
layout.setClickable(true);
layout.setAlpha(0.5f);
else
layout.setClickable(false);
layout.setAlpha(1f);
这 100% 以您认为应该的方式工作,只需禁用项目,并使用简单的 alpha 过滤器将其绘制为禁用以获得“幽灵”效果。
其中 YOUR_ITEM_REF 是列表中的对象(项目),不是适配器或列表,而是实际项目。
您的适配器应该为 allItemsEnabled
和 isEnabled
返回 true,以禁用损坏的默认功能处理。
这就是我使用Sandy D.
给出的答案解决我的问题的方法。
如果您的 layout
设置了点击处理程序(这不太可能,但可能由于用户错误而发生),则此方法不起作用。
【讨论】:
如果您不使用 convertView,并且每次都创建新视图,则不需要 else 块。以上是关于当 ArrayAdapter.isEnabled 返回 false 时,ListView 中的分隔符消失的主要内容,如果未能解决你的问题,请参考以下文章