Android:在linearlayout内的gridview的空白处检测点击事件

时间:2014-09-08 16:04:06

标签: android

我有以下问题。我在GridViewLinearLayout如下图所示。我想在用户点击GridView的空白区域时检测点击事件,在图像中,我想要的位置是红色区域,也在绿色区域内。

但我有以下问题。

  1. 如果我为onClickListener添加GridView:错误,因为适配器无法添加点击事件。
  2. 如果我为onItemClickListener添加GridView:我只能检测存在的项目(图片中是白框)
  3. 如果我为onClickListener添加LinearLayout,我只能检测绿色区域的点击事件,而不是红色区域。
  4. 那么我该如何解决上述问题。

    @Edit:我的布局如下:

    <LinearLayout>
      <GridView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>
    </LinearLayout>
    

    谢谢:)

    enter image description here

4 个答案:

答案 0 :(得分:10)

由于可以为父LinearLayout分配自己的OnClickListener,因此问题只是如何检测GridView中其子视图之外发生的单击。您可以继承GridView并覆盖dispatchTouchEvent()方法来完成此操作。使用pointToPosition()方法,我们可以确定触摸事件是否发生在子视图之外,并使用接口通知侦听器是否存在。在以下示例中,OnNoItemClickListener接口提供了该功能。

public class TouchyGridView extends GridView
{
    // Depending on how you're creating this View,
    // you might need to specify additional constructors.
    public TouchyGridView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    private OnNoItemClickListener listener;
    public interface OnNoItemClickListener
    {
        public void onNoItemClick();
    }

    public void setOnNoItemClickListener(OnNoItemClickListener listener)
    {
        this.listener = listener;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event)
    {
        // The pointToPosition() method returns -1 if the touch event
        // occurs outside of a child View.
        // Change the MotionEvent action as needed. Here we use ACTION_DOWN
        // as a simple, naive indication of a click.
        if (pointToPosition((int) event.getX(), (int) event.getY()) == -1
            && event.getAction() == MotionEvent.ACTION_DOWN)
        {
            if (listener != null)
            {
                listener.onNoItemClick();
            }
        }
        return super.dispatchTouchEvent(event);
    }
}

答案 1 :(得分:1)

使用

声明您的GridView不可点击/可聚焦
  

机器人:可点击=&#34;假&#34;和android:focusable =&#34; false&#34;

v.setClickable(false) and v.setFocusable(false)

现在应该将click事件分派给GridView的父级。

  

注意:为了实现此目的,您必须将click添加到其直接父级。或者设置android:clickable =&#34; false&#34;和   机器人:可聚焦=&#34;假&#34;到其直接父级传递监听器   进一步的父母。

这是对SIYB的回答 https://stackoverflow.com/a/18959830/3818437

答案 2 :(得分:1)

你可以设置OnItemClickListener和OnTouchListener以及
处理网格视图在OnTouchListener中单击空白区域。

    gridViewVar.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        public void onItemClick(AdapterView<?> parent, View VyuIdxPsgVar,
                int IdxPsgVal, long id)
        {
            // Code Something todo on item clicked
        }
    });
    gridViewVar.setOnTouchListener(new View.OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            if (gridViewVar.pointToPosition((int) event.getX(), (int) event.getY()) == -1
                    && event.getAction() == MotionEvent.ACTION_DOWN)
            {
                // Code Something todo on empty space
            }
            return false;
        }
    });

答案 3 :(得分:0)

看起来你把 onClickListener 放在错误的布局上(你只把它放在内部/绿色区域布局而不是全局RelativeLayout上,它可以捕获网格和线性布局的点击)。