自定义ListView的时候经常要继承BaseAdapter,如果ListView的每个Item有自己独立的监听事件,比如Button,ImageButton之类的,这样很容易造成焦点冲突,往往造成Item的焦点被
子控件获取,而子控件又不响应事件。这时候可以用Android的descendantFocusability来处理,API中对descendantFocusability属性的解释:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
解决这个问题只需要用到blocksDescendants属性就行,即覆盖子类控件获取焦点,其实这个属性是加在Item布局的根节点上,同时给子控件加上 android:clickable="true"、
android:focusable="false"两个属性,这样的话每个Item都能优先于子控件获取焦点,子控件因为设置focusable为false,在初始化的时候不会获取焦点,clickable的属性让它处于可点
击的状态,这样一来Item的点击事件跟子控件的点击事件完全分开了。不过在Item里面慎用ImageButton,ImageButton用此种方式是解决不了,具体原因没去查,应该跟焦点优先程度有关
,很多人都遇到类似的问题,如果非要用ImageButton可以尝试用ImageView来代替。
如果子控件的background用了select