關於ListView的item高亮選擇問題
阿新 • • 發佈:2019-02-07
以下方法可以實現高亮,但是也有bug,那就是隻要是翻頁,同樣在這個位置的item都會被點亮
一、
ListView如果需要item在選擇的時候保持顯示高亮,不能通過implements OnItemSelectedListener來實現,因為除非是通過鍵盤來控制,否則觸控過程中是不會觸發這個監聽器的。只能通過在implements OnItemClickListener,在點選item的時候來做處理,
或者可以通過指定的itemid,程式碼自動設定高亮,但這時需要注意,ListView沒有顯示出來的item(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