ListView條目點(diǎn)擊沒(méi)有效果的解決方案
分析無(wú)法響應(yīng)的原因
首先明白為什么點(diǎn)擊沒(méi)有響應(yīng)?點(diǎn)擊我們就聯(lián)想到點(diǎn)擊事件,一個(gè)點(diǎn)擊事件能響應(yīng)在于ACTION_UP事件會(huì)被響應(yīng)来涨,如此說(shuō)來(lái)item點(diǎn)擊沒(méi)有響應(yīng)我猜測(cè)就是ACTION_UP沒(méi)有被響應(yīng)到,于是我們?nèi)シ璍istView源碼看看:ListView相應(yīng)Action_up事件的源碼
private void onTouchUp(MotionEvent ev) {
switch (mTouchMode) {
...
if (inList && !child.hasFocusable()) {
if (mPerformClick == null) {
mPerformClick = new PerformClick();
}
}
...
}
}
結(jié)論:由上面代碼可以看到若是孩子具有焦點(diǎn),那么item是不會(huì)相應(yīng)點(diǎn)擊事件的扇调,所以才會(huì)出現(xiàn)這種點(diǎn)擊響應(yīng)的效果。
解決方案一:
給具有焦點(diǎn)的控件設(shè)置focusable=false,這樣ListView的孩子就布局布局有焦點(diǎn)的孩子了抢肛,因此就可以相應(yīng)點(diǎn)擊事件了狼钮。
解決方案二:
給item的根布局設(shè)置android:descendantFocusability屬性碳柱,下面來(lái)看看這幾個(gè)屬性的解釋?zhuān)?br>
該屬性是當(dāng)一個(gè)為view獲取焦點(diǎn)時(shí),定義viewGroup和其子控件兩者之間的關(guān)系熬芜。
屬性的值有三種:
- beforeDescendants:viewgroup會(huì)優(yōu)先其子類(lèi)控件而獲取到焦點(diǎn)
- afterDescendants:viewgroup只有當(dāng)其子類(lèi)控件不需要獲取焦點(diǎn)時(shí)才獲取焦點(diǎn)
- blocksDescendants:viewgroup會(huì)覆蓋子類(lèi)控件而直接獲得焦點(diǎn)莲镣,我們一般選擇blocksDescendants屬性。