以下方法可以实现高亮,但是也有bug,那就是只要是翻页,同样在这个位置的item都会被点亮
一、
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);
}
};
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
http://blog.youkuaiyun.com/top_code/article/details/17968267