<pre name="code" class="plain">
<pre name="code" class="plain">
获取item焦点
在使用ListView进行复杂布局渲染时,如果布局中包含Button,CheckBox系列的可获取事件焦点的组件时,就会导致ListView的选项失去焦点,点击每一项后无反应,就是因为子布局中的焦点控件抢夺了ListView的焦点,此时为了使ListView获取焦点可以在子布局的焦点控件组件上设置android:clickable="true"以及android:focusable="false"这两个属性:
<Button
android:id="@+id/muisc_download_btn"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/down_btn_selector"
android:layout_alignParentRight="true"
android:layout_marginTop="18dp"
android:layout_marginRight="10dp"
android:clickable="true"
android:focusable="false"
/>
这样Button就不会抢夺ListView的焦点,而且Button也能正常捕获自己的click事件。这种设置方法可以解决问题,但是当子布局中存在多个类似与Button这样可以获取事件焦点的控件时,每个控件都这样设置难免会觉得麻烦,这时可以使用Android提供的 android:descendantFocusability属性来进行设置,descendantFocusability属性有下面这三个可选值:
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
一般情况我们在子布局的根节点上使用descendantFocusability属性并设置第三个值:blocksDescendants,这样就可以覆盖子类控件而直接使ListView获得焦点。
自定义Item点击效果:
在ListView中点击每个Item,点击的那个item会有一个背景变化的效果,我们可以是用selector来实现自己想要的点击效果:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 按下后的显示效果 -->
<item android:state_pressed="true"><color android:color="#FCC302" /></item>
<!-- 正常情况下的效果 -->
<item><color android:color="#F4F4F4" /></item>
</selector>
上面的selector只是设置了按下后和正常情况下的显示颜色,可以在<item>中设置其他属性,如shape,背景图片等,定义完selector以后在ListView渲染view时将这个selector作为背景设置到item的view对象上:
//设置ListView Item点击后的效果,使用Selector
convertView.setBackgroundDrawable(getResources().getDrawable(R.drawable.list_item_selector));