2014-09-20 84 views
0

我在导航抽屉中使用简单的ListView,在布局XML中设置了android:choiceMode="singleChoice"。这让我使用的文本颜色选择:禁止选择某些ListView项目,但仍然获得点击事件?

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_activated="true" android:color="@color/primary_500" /> 
    <item android:color="@color/text_primary" /> 
</selector> 

这将色彩与primary_500所选择的项目,并与text_primary休息。


以上工作正常,但其中一个项目将推出,而不是加载一个片段一个新的活动,所以它不应该做出选择项目的ListView的。

我试过这个恢复它:

public void selectItem(int index) { selected_item = index; } 

public void revertSelectedItem() { 
    int y = navigation.getScrollY(); 
    list.setSelection(selected_item); 
    list.scrollTo(0, y); 
} 

和其他地方:

@Override 
public void onItemClick(ListView list, View view, int index, long id) { 
    switch((int)id) { 
     case R.id.exampleItem_forFragment: 
      /* Swap fragments */ 
      selectItem(index); 
      break; 

     case R.id.exampleItem_forActivity: 
      /* Launch activity */ 
      revertSelectedItem(); 
      break; 
    } 
} 

但是,即使revertSelectedItem()被调用时,选择没有改变。我假定在onItemClick()返回后才会分配新的选择,所以我的更改被覆盖。


有没有干净的方法来禁用或恢复选择只能更改某些项目,但仍收到的点击事件?

回答

0

似乎我只是误解了一些方法的目的。将revertSelectedItem()更改为如下所示:

public void revertSelectedItem() { 
    list.setItemChecked(selected_item, true); 
} 

表现得和我想要的完全一样。它看起来像ListView使用项目的“检查”状态,而不是选择,来决定哪些项目被标记。当在choiceMode="singleChoice"中时,调用setItemChecked()也会自动取消所有其他项目。