如何取消 Android ListView 项目在 ListView 的 setOnItemClickListener 中被激活/突出显示?
Posted
技术标签:
【中文标题】如何取消 Android ListView 项目在 ListView 的 setOnItemClickListener 中被激活/突出显示?【英文标题】:How to cancel Android ListView item from being activated/highlighted in ListView's setOnItemClickListener? 【发布时间】:2012-03-30 19:04:56 【问题描述】:在我的一项活动中,我有多个 ListView 控件。说 List 1、List 2 和 List 3。在 List 1 项目点击时,我从 web 服务加载 List 2 和 List 3 的数据。并且被点击的项目的背景被突出显示。我通过以下选择器实现了这一点。
<item android:drawable="@drawable/item_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/item_focused" android:state_focused="false"
android:state_pressed="false"
android:state_selected="true"/>
<item android:state_activated="true" android:drawable="@drawable/item_selected"/>
如您所见,我已指定 android:state_activated="true" 来更改点击/点击项目的 BG。这很好用。
实际上,如果正在加载其他项目的数据,我想防止点击的项目被选中/突出显示......就像
list1.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
// load data if no other call to web service is in progress
if (_isNotLoadingData)
loadList2AndList3DataUsingWebService();
else
//Stop This Item From selected/highlighted
//BUT none of the following work. .. Item is always Selected
view.setSelected(false);
//view.setActivated(false);
//view.setEnabled(false);
);
上面的代码会阻止多个调用被定向到我们的网络服务,但如果没有为该 ListView 项目调用网络服务,我无法阻止该项目被突出显示/激活。
我怎样才能做到这一点?
编辑于 2012 年 3 月 19 日晚上 8:08: 还没有适当的回复……我被困住了,正在等待任何帮助
【问题讨论】:
为什么要取消点击? 为什么不只在 onItemClick 方法中添加 if 语句?如果它是 onItemClick 函数中的第一件事,那么它基本上与 onBeforeClick() 函数相同...... 我已经更新了我的问题并进行了解释。很抱歉提供了一个不清楚的问题 @AamirHabib 您必须将.setItemSelected()
添加到父ListView,而不是子视图。看我的回答。
【参考方案1】:
几天前我实际上遇到了同样的问题。解决方案不 设置view.setItemChecked(false),而是在.onItemClick()
-方法中,调用您的listview 并设置listview.setItemChecked(position, false)
。这为我解决了。
例子:
listView.setOnItemClickListener(new OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long arg3)
// load data if no other call to web service is in progress
if (_isNotLoadingData)
loadList2AndList3DataUsingWebService();
else
ListView lv = (ListView) adapterView;
lv.setItemChecked(position, false);
);
【讨论】:
虽然我已经通过其他一些工作解决了这个问题......但如果我没有使用那个解决方案......我会更喜欢我们的方式......我会将你的评论标记为答案 老兄感谢您的方法。无论如何,您是否仍然保持“选择”行为并仅禁用“激活”行为?【参考方案2】:禁用适配器中的项目。这将删除所有点击,而您不必禁用项目点击侦听器或其他此类黑客。
我不知道您的适配器看起来如何,但通常您会覆盖适配器中的某些方法。请注意,我将方法称为 isLocked 而不是 isNotLocked。使用负布尔值通常是一个坏主意,会导致混淆,在这种情况下,您甚至不必在开始时将其设置为 false,因为这是布尔值的默认值。
public class MyCoolAdapter extends ListAdapter
private boolean mIsLocked;
public boolean areAllItemsEnabled ()
return false;
public abstract boolean isEnabled (int position)
if (mIsLocked)
return false;
return true;
...
如果您只想禁用某些行,则为这些位置返回 false,为其他位置返回 true。
您必须在更改 isLoading 参数时通知数据集已更改。这将导致列表视图重新查询适配器。 例如:
public void setIsLoading(final boolean isLocked)
mIsLocked = isLocked;
notifyDatasetChanged();
【讨论】:
【参考方案3】:在 onclick 监听器中,您可以在调用 click 事件的视图上调用 setonclicklistener(null)。这样视图将删除它自己的 onclicklistener。
mTitleView.setOnClickListener(null)
【讨论】:
【参考方案4】:尝试使用setSelector 将列表选择器设置为空。
【讨论】:
【参考方案5】:如果您不想在第一次点击后处理点击事件,只需使用yourList.setOnItemClickListener(null)
【讨论】:
@AamirHabib 阻止您的用户单击其他项目(按照此答案建议的方式)而不是仅禁用突出显示不是一个更好的主意吗?这样一来,您的用户就可以确定特定的列表条目目前不可用于操作。 我已经以同样的方式做到了......当点击一个项目时禁用整个列表两秒钟,目标是在这几秒钟内收到 Web 服务响应......但我正在寻找像@Reinier 建议的东西......我可能错了......但这些东西按我的计划工作【参考方案6】:listView.setOnItemClickListener(new OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long arg3)
//view.setEnabled(false);
//adapterView.setEnabled(false);
);
view.setEnabled(false);如果您想禁用用户单击的 listItem,请使用此选项。这样可以防止该特定项目上的 onclick 事件。
adapterView.setEnabled(false);如果要禁用整个 listView,请使用此选项。 它将阻止整个 listView 上的 onclick 事件。
希望有帮助
【讨论】:
感谢您的回答......但这不起作用......我也尝试使用 view.setSelected(false) 但没有奏效。 ...实际上,如果正在加载其他项目的数据,我想防止单击的项目被选中/突出显示..我还更新了我的问题以上是关于如何取消 Android ListView 项目在 ListView 的 setOnItemClickListener 中被激活/突出显示?的主要内容,如果未能解决你的问题,请参考以下文章
Android,如何取消闹钟? alarmManager.cancel 不工作