android ListView Tips

來源:互聯網
上載者:User

在ListView中設定Selector為null會報null 指標?
mListView.setSelector(null);//null 指標
試試下面這種:
mListView.setSelector(new ColorDrawable(Color.TRANSPARENT));
如何讓ListView初始化的時候就選中一項?
ListView需要在初始化好資料後,其中一項需要呈選中狀態。所謂"選中狀態"就是該項底色與其它項不同,setSelection(position)只能定位到某個item,但是無法改變底色呈高亮。setSelection(position)只能讓某個item顯示在可見Item的最上面(如果Item超過一屏的話)! 就是所謂的firstVisibleItem啦!
如果想要實現效果可以在listview所綁定的adapter裡的getView函數裡去完成一些具體的工作。可以記下你要高亮的那個item的index,在getView函數裡判斷index(也就是position),如果滿足條件則載入不同的背景。
ListView的右邊滾動滑塊啟用方法?
    很多開發人員不知道ListView清單控制項的快速滾動滑塊是如何啟用的,其實輔助滾動滑塊只需要一行代碼就可以搞定,如果你使用XML布局只需要在ListView節點中加入  android:fastScrollEnabled="true" 這個屬性即可,而對於Java代碼可以通過myListView.setFastScrollEnabled(true); 來控制啟用,參數false為隱藏。
    還有一點就是當你的滾動內容較小,不到當前ListView的3個螢幕高度時則不會出現這個快速滾動滑塊,該方法是AbsListView的基礎方法,可以在ListView或GridView等子類中使用快速滾動輔助。

1. 更新ListView中的數據,通過調用BaseAdapter對象的notifyDataSetChanged()方法:
      mAdapter.notifyDataSetChanged();
2. 每個listview都有無效的位置,如第一行的前一行,最後一行的後一行,這個無效的位置是一個常量.
     ListView.INVALID_POSITION
3. 有時我們需要在程式中通過點擊按鈕來控制ListView行的選中,這就用到了在程式中如何使用代碼來選擇ListView項.
         mListView.requestFocusFromTouch();
         mListView.setSelection(int index);
     第一條語句並不是必須的,但是若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得 焦點優先級高的控制項時,那麼第一條語句是你必須加的.
4.  同樣的,若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得 焦點優先級高的控制項時,ListView的setOnItemClickListener是不被執行的,這時你需要在你的xml檔案中對這些控制項添加  android:focusable="false" 注意這條語句要放在xml檔案中修改,在代碼中使用是無效的.
5. 如何保持ListView的滾動條一直顯示,不隱藏呢:  xml檔案中做如下修改    android:fadeScrollbars="false"
6. ListView本身有自己的按鍵事件,即你不需要設置方向鍵的標識,按下方向鍵ListView就會有默認的動作,那如何進行控制,編寫自己的onKey呢,你需要在Activity中重寫dispatchKeyEvent(KeyEvent event);方法,在這裡面定義你自己的動作就可以了
ListView 自訂捲軸樣式:
<ListView android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:stackFromBottom="true"//從下開始顯示條目
        android:transcriptMode="normal"
        android:fastScrollEnabled="true"
        android:focusable="true"
        android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track"
        android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"
/>
//scrollbar_vertical_track,crollbar_vertical_thumb自訂的xml檔案,放在Drawable中,track是指長條,thumb是指短條
去掉ListView Selector選種時黃色底紋一閃的效果:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">
  3. <solid android:color="@android:color/transparent"/>
  4. <corners android:radius="0dip" />
  5. </shape>
  6. //listview.setSelector(R.drawable.thisShape); 
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android">    <solid android:color="@android:color/transparent"/>    <corners android:radius="0dip" />    </shape>//listview.setSelector(R.drawable.thisShape);

或者還有一種辦法:
在Adapter中重寫public boolean isEnabled(int position)方法,將其返回false就可以了,推薦採用此種辦法,具體見http://gundumw100.iteye.com/admin/blogs/850654

Java代碼

  1. public boolean isEnabled(int position) {   
  2. // TODO Auto-generated method stub
  3. return false;   
public boolean isEnabled(int position) {// TODO Auto-generated method stubreturn false;}

ListView幾個比較特別的屬性
首先是stackFromBottom屬性,這隻該屬性之後你做好的列表就會顯示你列表的最下面,值為true和false
android:stackFromBottom="true"            
第二是transciptMode屬性,需要用ListView或者其它顯示大量Items的控制項即時跟蹤或者查看資訊,並且希望最新的條目可以自動滾動到可視範圍內。通過設定的控制項transcriptMode屬性可以將Android平台的控制項(支援ScrollBar)自動滑動到最底部。
android:transcriptMode="alwaysScroll"   
第三cacheColorHint屬性,很多人希望能夠改變一下它的背景,使他能夠符合整體的UI設計,改變背景背很簡單只需要準備一張圖片然後指定屬性 android:background="@drawable/bg",不過不要高興地太早,當你這麼做以後,發現背景是變了,但是當你拖動,或者點擊list空白位置的時候發現ListItem都變成黑色的了,破壞了整體效果。
如果你只是換背景的顏色的話,可以直接指定android:cacheColorHint為你所要的顏色,如果你是用圖片做背景的話,那也只要將android:cacheColorHint指定為透明(#00000000)就可以了
第四divider屬性,該屬性作用是每一項之間需要設定一個圖片做為間隔,或是去掉item之間的分割線android:divider="@drawable/list_driver"  其中  @drawable/list_driver 是一個圖片資源,如果不想顯示分割線則只要設定為android:divider="@drawable/@null" 就可以了
第五fadingEdge屬性,上邊和下邊有黑色的陰影android:fadingEdge="none" 設定後沒有陰影了~
第五scrollbars屬性,作用是隱藏listView的捲軸,android:scrollbars="none"與setVerticalScrollBarEnabled(true);的效果是一樣的,不活動的時候隱藏,活動的時候也隱藏
第六fadeScrollbars屬性,android:fadeScrollbars="true"  配置ListView布局的時候,設定這個屬性為true就可以實現捲軸的自動隱藏和顯示。
如何在使用gallery在flinging拖動時候不出現選擇的情況?
這時候需要注意使用
gallery.setCallbackDuringFling(false)
如何讓ListView自動滾動?
注意stackFromBottom以及transcriptMode這兩個屬性。類似Market用戶端的低端不斷滾動。
<ListView android:id="listCWJ" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:stackFromBottom="true"   
     android:transcriptMode="alwaysScroll" 
/>
如何遍曆listView 的的單選框?

ListView listView = (ListView)findViewById(R.id.設定檔中ListView的ID);   

  1. //全選遍曆ListView的選項,每個選項就相當於布局設定檔中的RelativeLayout
  2. for(int i = 0; i < listView.getChildCount(); i++){   
  3.       View view = listView.getChildAt(i);   
  4.       CheckBox cb = (CheckBox)view.findViewById(R.id.CheckBoxID);   
  5.       cb.setChecked(true);   
ListView listView = (ListView)findViewById(R.id.設定檔中ListView的ID);//全選遍曆ListView的選項,每個選項就相當於布局設定檔中的RelativeLayoutfor(int i = 0; i < listView.getChildCount(); i++){      View view = listView.getChildAt(i);      CheckBox cb = (CheckBox)view.findViewById(R.id.CheckBoxID);      cb.setChecked(true);}

如何讓ListView中TextView的字型顏色跟隨焦點的變化?
我們通常需要ListView中某一項選中時,他的字型顏色和原來的不一樣。 如何設定字型的顏色呢? 在布局檔案中TextColor一項來設定顏色,但是不是只設定一種顏色,而是在不同的條件下設定不同的顏色: 下面是個例子:

<?xml version="1.0" encoding="utf-8" ?>

  1. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  2. <item android:state_enabled="false" android:color="@color/orange"></item>
  3. <item android:state_window_focused="false" android:color="@color/orange"></item>
  4. <item android:state_pressed="true" android:color="@color/white"></item>
  5. <item android:state_selected="true" android:color="@color/white"></item>
  6. <item android:color="@color/orange"></item>
  7. </selector>
  8. 在擷取焦點或者選中的情況下設定為白色,其他情況設定為橘黃色。 
<?xml version="1.0" encoding="utf-8" ?><selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_enabled="false" android:color="@color/orange"></item><item android:state_window_focused="false" android:color="@color/orange"></item><item android:state_pressed="true" android:color="@color/white"></item><item android:state_selected="true" android:color="@color/white"></item><item android:color="@color/orange"></item></selector> 在擷取焦點或者選中的情況下設定為白色,其他情況設定為橘黃色。

如何自訂ListView行間的分割線?
所有基於ListView或者說AbsListView實現的widget控制項均可以通過下面的方法設定行間距的分割線,分割線可以自訂色彩、或圖片。
在ListView中我們使用屬性android:divider="#FF0000" 定義分隔字元為紅色,當然這裡值可以指向一個drawable圖片對象,如果使用了圖片可能高度大於系統預設的像素,可以自己設定高度比如6個像素android:dividerHeight="6px" ,當然在Java中ListView也有相關方法可以設定。
ListView不通過notifyDataSetChanged()更新指定的Item
Listview一般大都是通過notifyDataSetChanged()來更新listview,但通過notifyDataSetChanged()會把介面上現實的的item都重繪一次,這樣會影響ui效能。
可以通過更新指定的Item提高效率,虛擬碼如下:

private void updateView(int itemIndex){     

  1. int visiblePosition = yourListView.getFirstVisiblePosition();     
  2.   View v = yourListView.getChildAt(itemIndex - visiblePosition);//Do something fancy with your listitem view  
  3.   TextView tv = (TextView)v.findViewById(R.id.sometextview);   
  4.   tv.setText("Hi! I updated you manually");   
private void updateView(int itemIndex){    int visiblePosition = yourListView.getFirstVisiblePosition();    View v = yourListView.getChildAt(itemIndex - visiblePosition);//Do something fancy with your listitem view    TextView tv = (TextView)v.findViewById(R.id.sometextview);  tv.setText("Hi! I updated you manually");}

讓ListView中長按某些Item時能彈出contextMenu,有些不能
定義了一個listView,並為他設定了setOnCreateContextMenuListener的監聽,但這樣做只能使這個listView中的所有項在長按的時候彈出contextMenu 。
有時希望的是有些長按時能彈出contextMenu,有些不能。解決這個問題的辦法是為這個listView設定setOnItemLongClickListener監聽,然後實現

public boolean onItemLongClick(AdapterView<?> parent, View view,    

  1. int position, long id) {    
  2. if(id == 1){    
  3. return true;    
  4.   }    
  5. return false;    
  6. }  
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {   if(id == 1){     return true;   }   return false; } 

如果這一項的id=1,就不能長按。 這樣就可以了

轉自:http://gundumw100.iteye.com/blog/1169065

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.