我在导航抽屉中使用了一个简单的ListView
,并在布局XML中设置了android:choiceMode="singleChoice"
。这允许我使用文本颜色的选择器:
<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 :(得分:0)
似乎我只是误解了某些方法的目的。将revertSelectedItem()
更改为如下所示:
public void revertSelectedItem() {
list.setItemChecked( selected_item, true );
}
表现得和我想要的完全一样。看起来ListView
使用项目的“已检查”状态而非选择状态来决定标记哪些项目。在choiceMode="singleChoice"
时,调用setItemChecked()
也会自动取消选中所有其他项目。