禁用ActionMode启动取决于ListView项类型

时间:2014-06-09 12:26:41

标签: android android-listview android-actionmode

我有ListView,其中包含2种类型的数据。我想只在长按1种类型时才启动动作模式。

这是我启用动作模式的方式。

 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
 listView.setMultiChoiceModeListener(multiChoiceModeListener);

如何为第二种视图类型禁用操作模式。

2 个答案:

答案 0 :(得分:0)

这是我的解决方案:

public class DeviceExclListView extends ListView{

private ActionMode mAm;
private boolean mActionModeStarted;

public DeviceExclListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public DeviceExclListView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public DeviceExclListView(Context context) {
    super(context);
}

@Override
public ActionMode startActionMode(Callback callback) {
    return mAm = super.startActionMode(callback);
}

@Override
public boolean performItemClick(View view, int position, long id) {

    Object item = getItemAtPosition(position);
    if(item instanceof DeviceItem && mActionModeStarted){
        return true;
    }else{
        return super.performItemClick(view, position, id);
    }

}

@Override
public void setItemChecked(int position, boolean value) {
    Object item = getItemAtPosition(position);
    if(item instanceof DeviceItem){
        mAm.finish();
    }else{
        super.setItemChecked(position, value);
    }
}

public boolean isActionModeStarted() {
    return mActionModeStarted;
}

public void setActionModeStarted(boolean mActionModeStarted) {
    this.mActionModeStarted = mActionModeStarted;
}


}

setActionModeStarted由MultiChoiceModeListenerCallback设置。因此,当我长按DeviceItem动作模式立即关闭并且在动作模式期间无法检查时。

答案 1 :(得分:0)

以下适用于我(适用于AbsListView.MultiChoiceModeListener回调):

@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
                                      long id, boolean checked)
{
    Item item = mAdapter.getItem(position);
    if (!item.checkable && checked) {
        // Uncheck the item
        mListView.setItemChecked(position, false);
        return;
    }

    // the rest of the usual logic
    // ...
}

基本上,如果选中了不应检查的项目,我们取消选中它。