【Android问题集】ListView的item的listSelector在第一次时不起作用
来源:互联网 发布:app拼图软件 编辑:程序博客网 时间:2024/05/19 22:25
作者:Yogi
前言:在项目调试中,碰到第一次显示该界面时,其listSelector不起作用的情况,后面则其作用了。
背景介绍
listSelector.xml的代码如下
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/shortcut_list_press" android:state_pressed="true" android:state_selected="true"/> <item android:drawable="@drawable/shortcut_list_sel" android:state_pressed="false" android:state_selected="true"/> <item android:drawable="@drawable/shortcut_list_press" android:state_pressed="true"/> <item android:drawable="@drawable/shortcut_list_sel" android:state_selected="true"/></selector>
用在listview的item布局文件(shortcutmenu_dlg_listview_item),代码如下
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/item_root_layout" android:layout_width="fill_parent" android:layout_height="@dimen/favorite_dlg_item_height" android:background="@drawable/shortcut_list_selector" android:orientation="vertical" > ...(省略中间代码)</LinearLayout>
这些代码的用意是,当listview上的某个item被选中时,其背景是一个带红框的图片(shortcut_list_sel)。
界面显示的代码如下
/** * do something when view shows. */ private void initShow() { DisplayUtil.setViewFocus(mLvChannel); mChannelView.updateView(); int count = mAdapterChannel.getCount(); if ((count > 0) && (mSelection >= count)) { mSelection = count - 1; } mLvChannel.setSelection(mSelection); mAdapterChannel.setSelection(mSelection); }
正常来说,当界面显示时,listview的选中栏会显示红色框背景(shortcut_list_sel)。但是每次此界面第一次显示时,总是没有预期的效果。但是后续进行上下操作后,效果又正常了。
好了,背景介绍完毕。下面进入分析阶段。
问题分析
listSelector只是第一次不起作用,后面都起作用了,所以应该不是listSelector.xml写错了。很可能是没有满足listSelector定义的条件。
那么我们就在onItemSelected中加入以下代码
Log.d(TAG, "onItemSelected mLvChannel.getSelectedView() =" + mLvChannel.getSelectedView()); View v = mLvChannel.getSelectedView(); if (v != null) { Log.d(TAG, "onItemSelected v.isSelected() =" + v.isSelected()); }
最后打印结果是
D/FavoriteGroupManageDialog(23038): FavoriteGroupManageDialog onItemSelected mLvChannel.getSelectedView() =android.widget.LinearLayout{2d822910 V.E….. ..S….. 0,79-775,158 #7f0500fe app:id/item_root_layout}
D/FavoriteGroupManageDialog(23038): FavoriteGroupManageDialog onItemSelected v.isSelected() =false
果然,listview选中的item的状态是unselected的,所以listSelector不起作用是正常的。那么,该如何让这个item的状态为selected呢?
只有改我们的java代码了,再看一眼,java代码是这么写的
/** * do something when view shows. */ private void initShow() { DisplayUtil.setViewFocus(mLvChannel); //使得listview获取焦点 mChannelView.updateView(); int count = mAdapterChannel.getCount(); if ((count > 0) && (mSelection >= count)) { mSelection = count - 1; } mLvChannel.setSelection(mSelection); mAdapterChannel.setSelection(mSelection); }
我发现在其他界面的显示函数中,我都把DisplayUtil.setViewFocus(mLvChannel);放在尾端,而且都没有出现这样的错,于是我把这句话放到函数的末端,如下
/** * do something when view shows. */ private void initShow() { mChannelView.updateView(); int count = mAdapterChannel.getCount(); if ((count > 0) && (mSelection >= count)) { mSelection = count - 1; } mLvChannel.setSelection(mSelection); mAdapterChannel.setSelection(mSelection); DisplayUtil.setViewFocus(mLvChannel);//转移到了这里 }
一切都正常了。
总结
以前对于先使得listview获取到焦点还是先setSelection,没有先后顺序的概念。经过这次的出错,明白了2点。
1.setSelection需要在listview得到焦点之前,这样其selection所在的view才能真正被selected,否则是unselected的状态。
2.即使onItemSelected被调用了,也不表示其item的状态是selected。
另外,每个人的代码状况都不一样,所以我的解决方案并不是一定能解决你的问题,就像我在网上搜索“android listSelector不起作用”,得到的答案并不能解决我的问题。所以,一定要静下心分析所有的可能性,再逐一验证。
- 【Android问题集】ListView的item的listSelector在第一次时不起作用
- 解决ListView的listSelector被覆盖不起作用的问题
- 解决ListView的listSelector被覆盖不起作用的问题
- 关于为listview设置listSelector不起作用的问题
- Android-ListView中嵌套(ListView)控件时item的点击事件不起作用的问题
- ListView的listSelector属性问题
- android ListView ListSelector 不起作用(被覆盖)
- ListView的listSelector属性的问题
- 解决ListView设置listSelector无效的问题
- ListView item点击事件问题:第一次点击有效,再次点击item无效。场景是在item的展开效果
- ListView的listSelector失效
- ListView的listSelector失效
- 正确理解listView的listSelector
- Android关于listview设置属性 android:listselector = "@null" 无效的问题
- listview item的问题
- Android ListView的Item点击失效问题
- android中关于在ListView的子item中有控件抢占ListView的焦点问题
- 在popupWindow中使用ListView时对ItemView设置fill_parent不起作用的问题
- C++虚继承(八) --- 虚继承与继承的差异
- 将datatable转换成模型
- 高性能web站点的优化(一)--引子
- poj 1190 dfs+剪枝
- Install Ubuntu 15.10, cmake, Emacs, newclisp, clang++, cppcms(DO NOT UPDATE Python!!!)
- 【Android问题集】ListView的item的listSelector在第一次时不起作用
- xss学习的一小步
- C++11在时空性能方面的改进
- Tomcat – Java.Lang.OutOfMemoryError: PermGen Space
- 2. Add Two Numbers | Java最短代码实现
- ImageLoader 的一些配置
- play framework tutorial 1
- C++虚继承(九) --- 构造函数调用顺序的实用之处
- 队列的滑动窗口最大值练习题.