1. 程式人生 > >關於ListView的item高亮選擇問題

關於ListView的item高亮選擇問題

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