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

来源:互联网 发布:淘宝的瑕疵大牌化妆品 编辑:程序博客网 时间:2024/05/22 11:32

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();            }});@Overridepublic 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

0 0
原创粉丝点击