关于ListView的item高亮选择问题

在Android中,使用ListView实现item高亮时,直接使用OnItemSelectedListener无法响应触摸事件。应该通过OnItemClickListener监听点击并处理高亮。在页面加载时如需处理,必须等待页面完全显示,可在onWindowFocusChanged()中进行。文章提供了两种解决方法的链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下方法可以实现高亮,但是也有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

http://blog.youkuaiyun.com/top_code/article/details/17968267


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值