Android:包含自定义行和调用ContextMenu的ListActivity

时间:2011-05-01 12:56:41

标签: android contextmenu listactivity

我在LitsActivity中有一个ListView,它由从单独的XML文件中膨胀的行组成。这个行由我的自定义适配器中的convertView方法填充此ListView。我正在尝试在每一行上调用上下文菜单。通常,我们通过调用

来完成此操作

registerForContextMenu(ourListViewInstance);

onCreate方法中的

。但它对我不起作用,onCreateContextMenu方法没有被调用,因为此时没有列表行,它们稍后出现。我试着用

registerForContextMenu(row);

在我的自定义列表适配器的getView方法中,以便每行都注册“长按”并且它可以正常工作,但由于某些原因,它是不可接受的,并且需要通常的方法。

这是我的ItemsAdapter,它创建了ListView行的实例:

class ItemsAdapter extends ArrayAdapter<ItemsModel> {

    public ItemsAdapter(ArrayList<ItemsModel> list) {
        super(Items.this, R.layout.custom_row_view, list);
    }

    private ItemsModel getModel(int position) {
        return (((ItemsAdapter) itemsList.getAdapter()).getItem(position));
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;

        final ItemsModel currentItemModel = getModel(position); // Model class storing data for all the rows. 
        ItemsResourceManager resourceManager = null; // class used to easily get and set row views.

        if (row == null) {
            row = View.inflate(getBaseContext(), R.layout.custom_row_view, null);
            row.setClickable(true);
            row.setFocusable(true);
            row.setBackgroundResource(android.R.drawable.menuitem_background);
            resourceManager = new ItemsResourceManager(row);
            row.setTag(resourceManager);
        } else {
            resourceManager = (ItemsResourceManager) row.getTag(); //class used to easily get and set row views.
        }
        registerForContextMenu(row);  // works for each separate LisView row

        //... skipped setText actions for this row
        }
        return row;
    }
}

此外,我尝试从任何可聚焦元素中彻底清除我的custom_row_view.xml,但它没有帮助。

1 个答案:

答案 0 :(得分:1)

问题出在我的自定义适配器类的onClickListener中。它阻止了contextMenu处理,因为每次都会调用“短”点击。现在,clickListener和ContextMenu处理程序都位于ListActivity类中,它可以正常工作。