GridView中按钮的OnClickListener

时间:2016-12-13 15:09:22

标签: android button gridview onclicklistener

我有一个显示GridView网格的Buttons适配器。现在我想为我的按钮设置OnClickListener,但当然他们没有自己的R.id我可以通过适配器添加到网格中,而不是layout.xml

我尝试使用OnItemClickListener,如下所示:

m_onItemClickListener = new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int pos, long l) {
            switch(pos) {
                case MyConstants.POS_OF_BUTTON_1:
                        // Do stuff...
                    break;
                case MyConstants.POS_OF_BUTTON_2:
                        // Do stuff...
                    break;
            }
        }
    };

但据我了解,您无法使用clickablefocusable项目OnItemClickListener。我怎么绕这个?谢谢!

1 个答案:

答案 0 :(得分:0)

有更多优雅的方法来完成这一切(从使用带有GridLayoutManager而不是GridView的RecyclerView开始),但是如果您正在寻找快速简便的解决方案来使用已有的东西,这就是你能做的:

首先,你应该在你的按钮上设置一些ID,它们不必来自R.id(尽管如果你从布局中夸大了视图,并在那里定义了ID,那将是更好的选择,并使用ViewHolder)。

最坏的情况是,您可以在适配器中为每个种类按钮(例如static final int DELETE_BUTTON = 1;)定义ID,然后在按钮上设置这些ID在代码中手动。

然后,你可以传递一个简单的OnClickListener(不是OnItemClickListener ),它可以处理单个项目中所有这些不同按钮的点击,并传递给你的适配器,并使适配器在每个按钮上设置监听器按钮,用于网格中的每个项目视图。

您还需要将项目的位置设置为按钮视图本身的标记,以便在点击发生时,您可以确定点击发生的项目。

示例代码如下:

View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Object tag = v.getTag();
        if (!(tag instanceof Integer)) {
            // Show error message or just throw an exception.
        }
        int position = (Integer) tag;
        // We get the item at this position, to know which one to use
        Item item = adapter.getItem(position);
        switch (v.getId()) {
            case DELETE_BUTTON:
                // Delete stuff here
                break;
            case EDIT_BUTTON:
                // Edit stuff here
                break;
            ...
        }
    }
};

adapter.setOnClickListener(listener);

然后,在适配器的getView方法中,您需要在每个按钮上设置此侦听器,并将项目的位置设置为按钮上的标记。这样,您就可以在上面的监听器代码中找出按钮所属的项目。

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    ...
    deleteButton.setId(DELETE_BUTTON);
    deleteButton.setOnClickListener(listener);
    deleteButton.setTag(i);
    ...
}

一般来说,我真诚地敦促您在有空的时候查看ViewHolder模式,以及RecyclerView和GridLayoutManager。大部分内容也会在那里进行转换。

修改

为了使列表/网格项中的多个视图可单击/可聚焦,您需要在项目的根视图上将descendantFocusability属性设置为blockDescendants,或者只是在XML中,或通过以下代码:

viewGroup.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);