GridView, ListView的item中如果嵌入了button会导致item点击失效。
原因是:
AbsListView.java 中的代码:
private void onTouchUp(MotionEvent ev) {
switch (mTouchMode) {
case TOUCH_MODE_DOWN:
case TOUCH_MODE_TAP:
case TOUCH_MODE_DONE_WAITING:
final int motionPosition = mMotionPosition;
final View child = getChildAt(motionPosition - mFirstPosition);
if (child != null) {
if (mTouchMode != TOUCH_MODE_DOWN) {
child.setPressed(false);
}
final float x = ev.getX();
final boolean inList = x > mListPadding.left && x < getWidth() - mListPadding.right;
if (inList && !child.hasFocusable()) {
if (mPerformClick == null) {
mPerformClick = new PerformClick();
}
final AbsListView.PerformClick performClick = mPerformClick;
performClick.mClickMotionPosition = motionPosition;
performClick.rememberWindowAttachCount();
mResurrectToPosition = motionPosition;
...
}
在响应onItemClickListener之前会先判断子view是否有焦点。
!child.hasFocusable()
如果无焦点才会响应onItemClickListener中的内容。
所以必须保证子类无焦点。
方法1. item容器调用 setDescendantFocusability( FOCUS_BLOCK_DESCENDANTS); button 调用setFocusable(false)
方法2. xml文件中 配置 android:descendantFocusability= "blocksDescendants" button 设置 android:focusable = "false"
spannableString 点击失效的处理方法: