最近碰到需求需要實(shí)現(xiàn)GridView空白處的點(diǎn)擊事件,記錄一下:
這次也需要我們定義一個(gè)類去繼承GridView柬姚,先上代碼在解釋
public class UnscrollableGridView extends GridView {
private OnTouchBlankListener OnTouchBlankListener;
public UnscrollableGridView(Context context) {
super(context);
}
public UnscrollableGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public UnscrollableGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
//定義回調(diào)接口
public interface OnTouchBlankListener {
void OnTouchBlank();
}
//設(shè)置空白處點(diǎn)擊事件方法
public void setOnTouchBlankListener(OnTouchBlankListener listener) {
OnTouchBlankListener = listener;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (OnTouchBlankListener != null) {
//這句很關(guān)鍵讲竿,是獲取用戶點(diǎn)擊是第幾個(gè)子項(xiàng)還是空白處
int motionPosition = pointToPosition((int) event.getX(), (int) event.getY());
//當(dāng)用戶點(diǎn)擊是空白處時(shí)并抬起手指時(shí)泥兰,執(zhí)行回調(diào)方法
if (motionPosition == INVALID_POSITION && event.getAction() == MotionEvent.ACTION_UP) {
OnTouchBlankListener.OnTouchBlank();
return true;
}
}
return super.onTouchEvent(event);
}
}
最關(guān)鍵就在于pointToPosition方法,看下源碼
整個(gè)方法的功能是:你傳入用戶點(diǎn)擊的坐標(biāo)(x,y),返回你點(diǎn)擊的第幾個(gè)子項(xiàng)题禀,如果點(diǎn)擊的位置下沒(méi)有子項(xiàng)鞋诗,就返回INVALID_POSITION,我們就是通過(guò)它來(lái)判斷用戶點(diǎn)擊的是空白處迈嘹。
記錄一個(gè)小知識(shí)點(diǎn):
當(dāng)你的listview或GridView的子控件中包括ImageButton削彬,Button,CheckBox等子控件時(shí)秀仲,此時(shí)這些子控件會(huì)將焦點(diǎn)獲取到融痛,所以常常當(dāng)點(diǎn)擊item時(shí)變化的是子控件,item本身的點(diǎn)擊沒(méi)有響應(yīng)神僵。
這時(shí)候就可以使用descendantFocusability來(lái)解決雁刷,該屬性是定義viewGroup和其子控件兩者之間獲取焦點(diǎn)的關(guān)系。
屬性的值有三種:
beforeDescendants:viewgroup會(huì)優(yōu)先其子類控件而獲取到焦點(diǎn)
afterDescendants:viewgroup只有當(dāng)其子類控件不需要獲取焦點(diǎn)時(shí)才獲取焦點(diǎn)
blocksDescendants:viewgroup會(huì)覆蓋子類控件而直接獲得焦點(diǎn)
我們用到的是第三種