Android:在linearlayout内部gridview的空白处检测click事件

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

但是我有以下问题。

  1. 如果我为GridView添加onClickListener :错误,因为Adapter无法添加单击事件。
  2. 如果我添加GridView onItemClickListener :我只能检测到存在的项目(在图像中是白色的框)
  3. 如果我为LinearLayout添加onClickListener ,我只能检测绿色区域的点击事件,而不是红色区域。

那么如何解决上面的问题。

@编辑:我的布局看起来像:

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

谢谢 :)

在这里输入图像说明

Solutions Collecting From Web of "Android:在linearlayout内部gridview的空白处检测click事件"

由于父LinearLayout可以分配自己的OnClickListener ,问题只是如何检测在其子View之外发生的GridView内的点击。 您可以inheritanceGridView并重写dispatchTouchEvent()方法来完成此操作。 使用pointToPosition()方法,我们可以确定一个触摸事件是否发生在子视图之外,并且使用一个接口来通知一个侦听器。 在以下示例中, OnNoItemClickListener接口提供了该function。

 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); } } 

U可以设置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; } }); 

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

通过使用声明你的GridView不可点击/可聚焦

android:clickable =“false”和android:focusable =“false”

要么

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

点击事件现在应该分派给GridView的父项。

注意:为了实现这一点,你必须添加点击它的直接父母。 或者将android:clickable =“false”和android:focusable =“false”设置为其直接父级,以将侦听器传递给父级。

thnx SIYB的答案https://stackoverflow.com/a/18959830/3818437