6

我在多选模式下为上下文菜单注册了一个列表视图:

private void initListViewForContextMenu(){
    log.d("FilesFragment", "initListViewForContextMenu()");
    ListView listView = getListView();
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { ...

问题是并非我的视图中的所有项目都应该是可选择的,只有那些显示特殊图标的项目应该可供选择。我不知道如何实现这一点,我定义了一个OnItemLongClickListener

getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> adapter, View view, int position, long id) {
        Log.d("FilesFragment", "OnItemLongClickListener.onItemLongClick at pos " + position);
        PfmDocument doc = (PfmDocument)adapter.getItemAtPosition(position);
        if (doc.isOnBasket()){
            Log.d("FilesFragment", "OnItemLongClickListener.onItemLongClick detected in basket");
            ListView lv = (ListView) adapter;
            lv.setItemChecked(position, false);
        }
        return false;
        }
    }); 

但是这个监听器永远不会被调用。

我也尝试OnLongClickListener在适配器中设置行视图,但是即使上下文菜单关闭(不在选择模式下),执行此正常单击也会禁用。

if (doc.isOnBasket()){
    rowView.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        return false; // do nothing, already in basket
    }
});

// }

4

1 回答 1

10

如果您深入研究 android 源代码(AbsListview),您会看到将choiceMode 设置为MULTIPLE_MODAL将接管长按。这就是为什么你的听众永远不会被调用的原因。

isEnabled(position)您可以通过在适配器中返回 true/false 来决定视图是否可点击。

下面的代码只解决了在actionmode期间,已经添加到购物篮中的项目不可点击的部分。

但是如果它不是有效的项目,取消选中被长按的项目应该是相当容易的。

希望这有帮助!

在您的 MultiChoiceModeListener 中:

@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu)
{
    this.adapter.setActionMode(true);
    return true;
}

@Override
public void onDestroyActionMode(ActionMode mode)
{
    this.adapter.setActionMode(false);
}

然后在您的自定义适配器中:

public abstract class AbstractCollectionAdapter extends AbstractCursorAdapter
{
    private boolean isActionMode;

    public AbstractCollectionAdapter(Context context)
    {
        super(context);

        this.isActionMode = false;
    }

    @Override
    public boolean isEnabled(int position)
    {
        if (this.isActionMode)
        {
            final Object item = this.getItem(position);
            if (!item.isInBasket())
            {
                //only enable items that are not inside the basket
                return true;
            }
            //all other items are disabled during actionmode
            return false;
        }
        //no actionmode = everything enabled
        return true;
    }

    public void setActionMode(boolean isActionMode)
    {
        this.isActionMode = isActionMode;
    }
}
于 2013-06-18T11:59:10.373 回答