关于ListView的item高亮选择问题
2014-03-22 13:38
190 查看
以下方法可以实现高亮,但是也有bug,那就是只要是翻页,同样在这个位置的item都会被点亮
一、
ListView如果需要item在选择的时候保持显示高亮,不能通过implements OnItemSelectedListener来实现,因为除非是通过键盘来控制,否则触摸过程中是不会触发这个监听器的。只能通过在implements OnItemClickListener,在点击item的时候来做处理,
或者可以通过指定的itemid,代码自动设定高亮,但这时需要注意,ListView没有显示出来的item(item很多,有一部分没有显示到),通过
getChildAt(index)是得不到view的,即null。同理,getChildCount得到的也只是可见范围内的item数量。因此需要首先让该item显示在ListView可见范围,通过listview.setSelection可以做到,但是在使用setSelection的时候还需要注意一些事项,举例说明:
ps:如果是需要在页面还在加载的时候就(onCreate或onResume等)处理高亮或者其他(例如getChildAt),肯定得到的是null,除非等到页面加载完毕,可以在onWindowFocusChanged()中做处理
第二种方法可以很好的实现高亮,无bug
http://www.cnblogs.com/dyllove98/archive/2013/07/31/3228601.html
/article/1609781.html
一、
ListView如果需要item在选择的时候保持显示高亮,不能通过implements OnItemSelectedListener来实现,因为除非是通过键盘来控制,否则触摸过程中是不会触发这个监听器的。只能通过在implements OnItemClickListener,在点击item的时候来做处理,
OnItemClickListener channelOnItemClickListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub proListCheckedId = arg2;//选中的item ID要记录下来 System.out.println("list item id:" + proListCheckedId); if(formalProgramItem != null){ formalProgramItem.setBackgroundResource(R.drawable.menuitemstyle);//取消高亮 } arg1.setBackgroundResource(R.drawable.menuitemstyle_selected);//设置高亮 formalProgramItem = arg1; proListCheckedId = arg2;//选中的item ID要记录下来 System.out.println("list item id:" + proListCheckedId); } };
或者可以通过指定的itemid,代码自动设定高亮,但这时需要注意,ListView没有显示出来的item(item很多,有一部分没有显示到),通过
getChildAt(index)是得不到view的,即null。同理,getChildCount得到的也只是可见范围内的item数量。因此需要首先让该item显示在ListView可见范围,通过listview.setSelection可以做到,但是在使用setSelection的时候还需要注意一些事项,举例说明:
/** * 记录上一个播放的item,用作播放列表item取消高亮 */ private View formalProgramItem = null; /** * 对播放列表高亮的item做处理 */ private void lightItem(){ //异步处理,setSelection才能有效 //setSelection并不能使得item selected或高亮,只是让该item显示在列表可见范围 playListView.post(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub playListView.setSelection(proListCheckedId); } }); //为listview是异步加载的,立马获取数量是不能够获取到的,必须用post方法来处理一下 //为了和上一个post异步,还需要delay一段时间,才有效 playListView.postDelayed(new Runnable() { @Override public void run() { //获取将要显示的item view //在ListView中,使用getChildAt(index)的取值,只能是当前可见区域(列表可滚动)的子项! //需要使用getFirstVisiblePosition()获得第一个可见的位置,再用当前的position-getFirstVisiblePosition(),再用getChildAt取值! View view = playListView.getChildAt(proListCheckedId - playListView.getFirstVisiblePosition()); //之前高亮的item取消高亮 if(formalProgramItem != null){ formalProgramItem.setBackgroundResource(R.drawable.menuitemstyle); } //新选择的item高亮 if(view != null){ view.setBackgroundResource(R.drawable.menuitemstyle_selected); } //formalProgramItem重新赋值 formalProgramItem = view; } }, 200); }
ps:如果是需要在页面还在加载的时候就(onCreate或onResume等)处理高亮或者其他(例如getChildAt),肯定得到的是null,除非等到页面加载完毕,可以在onWindowFocusChanged()中做处理
/** * activity还没有加载完,不能处很多事件,例如弹出一个popWindow或者其他。 * 想在activity加载完毕的同时处理一下事件,android给开发者提供了一个方法,可以解决这个问题, * 这个方法就是onWindowFocusChanged() */ @Override public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub if(hasFocus){ mainListView.getChildAt(0).setBackgroundResource(R.drawable.menuitemstyle_selected); mainListView.getChildAt(1).setBackgroundResource(R.drawable.menuitemstyle); } super.onWindowFocusChanged(hasFocus); }
第二种方法可以很好的实现高亮,无bug
http://www.cnblogs.com/dyllove98/archive/2013/07/31/3228601.html
/article/1609781.html
相关文章推荐
- 关于设置选择条颜色多个ListView之间切换问题解决方案
- 关于ListView中CheckBox选择混乱的问题
- 关于设置选择条颜色多个ListView之间切换问题解决方案
- 关于listView滑动间距问题
- 关于选择脚本的问题
- sos 关于listview的问题求助
- ASP.NET MC4 关于global 文件选择数据库问题
- 【机器学习基础】机器学习算法的分类——关于如何选择机器学习算法和适用解决的问题
- 关于ScrollView 与ListView的 之间存在的兼容性问题
- 关于ListView获取焦点的问题
- 关于listview中item无法获去焦点的问题
- listview checkbox重复选择的问题
- 关于STM32 MDK中USE_STDPERIPH_DRIVER问题及 STM32F10X_LD STM32F10X_MD STM32F10X_HD STM32F10X_CL宏定义的选择
- 关于 android listview 加载数据错位(错乱)问题
- 关于三级联动选择完成之后的产品显示问题
- 关于listview中添加倒计时功能卡顿问题
- 关于ListView使用AQuery加载图片乱序问题
- 关于ListView的加载原理及优化问题
- listview中radiobutton的选择问题
- 软件发布中关于开源License的选择问题