禁止选择一些ListView项目,但仍然可以获得点击事件?

时间:2014-09-20 00:12:08

标签: java android listview

我在导航抽屉中使用了一个简单的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()返回之后才会分配新的选择,所以我的更改会被覆盖。


是否有一种干净的方法来禁用或还原仅针对特定项目的选择更改,但仍然会收到点击事件?

1 个答案:

答案 0 :(得分:0)

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

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

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