ListView获取item的焦点以及设置item点击的背景效果

<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会优先其子类控件而获取到焦点

        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));

这里只是说明一下这个做法和思路,通过自定义selector可以改变成我们想要的效果,至于想实现什么效果由自己喜好去定义。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值