AndroidTV/机顶盒 ListView获取焦点与点击事件问题处理方案

AndroidTV/机顶盒 ListView获取焦点与点击事件问题处理方案

转载请注明出处:http://blog.csdn.net/qq_18120631/article/details/47257349

本人大二,最近在写一个Android机顶盒的小项目,遇到了这样一个问题。由于App的布局复杂,导致ListView用遥控器获取其Item焦点时变得很卡很慢。需要不断点击上下键才能移动焦点。看了下Logcat,发现焦点每移到最后一个时,总是”can’t find view with Id 1/2/3/4”,试了网上无数种解决方案还是不行。

后来发现,自己为每个Item.setFocusable(true)的绑定方式是有问题的,会导致android系统在ListView里面遍历view的速度很慢。因为当我把Item.setFocusable(true)给注释掉时,ListView非常流畅

最后的解决方案是,直接在Listview做一个全局的绑定来解决问题。

ListViewItem绑定问题解决方案

ListView 配置如下

<ListView
         android:id="@+id/lv_classify"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:divider="@null"
         android:focusable="true"
         android:listSelector="@drawable/bg_button_focused"
         android:scrollbars="@null" >
</ListView>

bg_button_focused.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/l_top" android:state_focused="true"></item>

</selector>

ListView获取Item的焦点问题

当ListView全局绑定焦点后,又有一个问题来了,当你按到遥控器上的确认键时,不会有点击效果。
之前的配置文件如下

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/l_top" android:state_focused="true"></item>

    <item android:drawable="@color/purple" android:state_pressed="true"></item>
</selector>

即使pressed设置为true还是没有作用,因此我是自己实现了一个选中效果,具体代码如下:

classifyListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                if (position != clickPosition) {
                    clickPosition = position;
                } 
                adapter.notifyDataSetChanged();
            }
});



@Override
public View getView(final int position, View convertView,
                ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(STBMainActivity.this);
    convertView = inflater.inflate(R.layout.item_classify, null);
    final TextView tv = ((TextView) convertView
                    .findViewById(R.id.tv_item_classify));
    tv.setText(InfoConfig.info.class_list.get(position).name);  
    tv.setBackgroundResource(R.drawable.bg_button_focused);
    if (position == clickPosition) {
    tv.setBackgroundColor(STBMainActivity.this.getResources().getColor(R.color.purple));
            }
        return convertView;
}

实现起来非常简单。

希望这篇文章能帮助到大家,毕竟目前AndroidTV开发技术类的文章还是比较少的,请各位多多指正!

转载请注明出处:http://blog.csdn.net/qq_18120631/article/details/47257349

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值