开发中常见的问题,项目中的 ListView 不仅仅是简单的文字,常常需要自定义 ListView 和继承 BaseAdapter 的 Adapter。在编写过程中,可能会出现点击每一个 Item 没有反应、无法获取焦点的情况。原因多半是由于自定义的 Item 中存在 ImageButton、Button、CheckBox 等子控件,这些子控件会获取焦点,导致点击 Item 时变化的是子控件而非 Item 本身。
此时可以使用 descendantFocusability 属性来解决。该属性定义当 View 获取焦点时,ViewGroup 和其子控件两者之间的关系。
属性的值有三种:
- beforeDescendants:ViewGroup 优先于其子类控件获取焦点。
- afterDescendants:ViewGroup 只有当其子类控件不需要获取焦点时才获取焦点。
- blocksDescendants:ViewGroup 会覆盖子类控件而直接获得焦点。
通常使用第三种方案,即在 Item 布局的根布局加上 android:descendantFocusability="blocksDescendants" 属性。至此,ListView 点击失效的问题即可解决。建议遇到技术问题时查阅官方文档,原文理解往往比翻译更准确。


