您的位置:首页 > 其它

关于ListView的item高亮选择问题

2014-03-22 13:38 190 查看
以下方法可以实现高亮,但是也有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);

}
};


或者可以通过指定的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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: