如何取消 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 1List 2List 3。在 List 1 项目点击时,我从 web 服务加载 List 2List 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 不工作

如何去掉ListView的点击效果

如何在单击 ListView 中的按钮时取消选中所有列表项

Android ListView取消item的点击效果

Android中取消GridView & ListView默认的点击背景色

如何在android的listview中获取项目的视图?