我有以下问题。我在GridView
内LinearLayout
如下图所示。我想在用户点击GridView
的空白区域时检测点击事件,在图像中,我想要的位置是红色区域,也在绿色区域内。
但我有以下问题。
onClickListener
添加GridView
:错误,因为适配器无法添加点击事件。onItemClickListener
添加GridView
:我只能检测存在的项目(图片中是白框)onClickListener
添加LinearLayout
,我只能检测绿色区域的点击事件,而不是红色区域。那么我该如何解决上述问题。
@Edit:我的布局如下:
<LinearLayout>
<GridView
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
谢谢:)
答案 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的父级。
这是对SIYB的回答 https://stackoverflow.com/a/18959830/3818437注意:为了实现此目的,您必须将click添加到其直接父级。或者设置android:clickable =&#34; false&#34;和 机器人:可聚焦=&#34;假&#34;到其直接父级传递监听器 进一步的父母。
答案 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上,它可以捕获网格和线性布局的点击)。