如何在ListView的setOnItemClickListener中取消Android ListView项目的激活/高亮显示?

如何在ListView的setOnItemClickListener中取消Android ListView项目的激活/高亮显示?

问题描述:

在我的一项活动中,我有多个ListView控件。说清单1,清单2 & 清单3。在列表1项目的点击,我加载数据为列表2 & 列表3从web服务。被点击的项目的背景被突出显示。我通过以下选择器实现了这一点如何在ListView的setOnItemClickListener中取消Android ListView项目的激活/高亮显示?

<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"/> 

正如你所看到的,我已指定机器人:state_activated =“真”改变点击/轻按的项目的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); 
       } 
      } 
     }); 

上面的代码将停止多次调用被引导到我们的Web服务,但如果没有为该ListView项目调用Web服务,我无法停止突出显示/激活项目。

我该如何操作?

在下午8时08分2012年3月19日编辑:没有正确答复可是...我坚持&等待任何帮助

+0

为什么要取消点击? – 2012-03-14 10:37:40

+0

为什么你不只是做一个if语句到你的onItemClick方法?如果这是onItemClick函数中的第一件事,那么它与onBeforeClick()函数基本相同... – KarlKarlsom 2012-03-14 10:57:07

+0

我已更新我的问题并已解释。对不起,提供一个不明确的问题 – Aamir 2012-03-14 13:04:53

我居然遇到了同样的问题,前几天。解决方案是而不是来设置view.setItemChecked(false),而是在.onItemClick()-方法中,调用您的列表视图并设置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); 
     } 
    } 
}); 
+0

强硬我已经解决了一些其他工作的问题......但如果我没有使用过这种解决方案...我会首选urs的方式...我会将你的评论标记为答案 – Aamir 2012-03-23 12:29:13

+0

Dude感谢你的方法。无论如何,你仍然保持“选择”行为,只禁用“激活”的行为? – Machado 2015-05-15 17:54:02

的onclick监听器,你可以在查看通话setonclicklistener(空)内这称为点击事件。这种方式将删除自己的onclicklistener。

mTitleView.setOnClickListener(null) 
+0

谢谢..但这不是我想 – Aamir 2012-03-14 13:14:00

,如果你不想处理单击事件第一次点击后,只需使用yourList.setOnItemClickListener(null)

+0

谢谢..但这不是我想要的 – Aamir 2012-03-14 13:13:48

+0

@AamirHabib wouldnt它是一个更好的主意,以防止您的用户点击其他项目(这种答案建议的方式),而不仅仅是禁用亮点?这样,您的用户就可以确切地知道特定的列表条目目前不可用于采取行动。 – Urban 2012-03-22 22:16:12

+0

我已经做了同样的方式...通过禁用整个列表两秒钟,当一个项目被点击的目的是网络服务响应会在这几秒钟内收到......但我正在寻找类似的东西@Reinier建议...我可能是错误的..但那东西按我的计划工作 – Aamir 2012-03-23 12:34:41

listView.setOnItemClickListener(new OnItemClickListener() 
    { 

     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, 
       int position, long arg3) 
     { 

      //view.setEnabled(false); 
      //adapterView.setEnabled(false); 
     } 
    }); 
  1. view.setEnabled(假);如果要禁用用户点击过的listItem,请使用此选项。这样可以防止该特定项目上的onclick事件。

  2. adapterView.setEnabled(false);如果你想禁用整个listView,使用这个。 它会阻止整个listView上的onclick事件。

希望这有助于

+0

谢谢你的答案..但这不起作用...我尝试使用** view.setSelected(false)**太,但不是工作。 ...其实我想防止被点击的项目被选中/突出显示,如果某些其他项目的数据正在加载..我也更新了我的问题 – Aamir 2012-03-14 12:43:30

请在禁用适配器的项目。这将删除所有点击,而不必禁用项目点击侦听器或其他类似的黑客。

我不知道你的适配器是怎么样的,但通常你会覆盖你的适配器中的一些方法。请注意,我调用方法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参数时,您将不得不通知该数据集已更改。这将导致listview重新查询适配器。 例如:

public void setIsLoading(final boolean isLocked) { 
    mIsLocked = isLocked; 
    notifyDatasetChanged(); 
} 

尝试设置列表中选择要使用空setSelector