1. 程式人生 > >listview之一些常見問題的解決方法

listview之一些常見問題的解決方法

android中Listview使我們經常使用的控制元件,一般常規的用法就是在佈局檔案中定義然後在Activity使用findViewById()找到,然後定義一個listview每一項的佈局檔案,在adapter中getView方法裡Inflate該XML檔案得到一個view返回,最後給listview設定該介面卡。其中adapter有如下幾種:

1、ArrayAdapter,只能用來適配listview中Item只有一個TextView的情況。

2、SimpleAdapter,用來適配item中既有TextView也有ImageView的情況。

3、SimpleCursorAdapter,用來結合資料庫使用,除了資料來源是一個Cursor外,其餘的使用同上面的SimpleAdapter。

4、BaseAdapter,前面都是封裝好的Adapter,我們只需要往構造方法傳引數就可以使用,BaseAdapter是一個抽象類,需要重寫裡面的4個抽象方法才可以使用。

一般item的佈局都是一樣的,當item的條目需要顯示多個佈局檔案的時候,我們必須要使用BaseAdapter,並且重寫 getItemViewType(int position)和 getViewTypeCount()這兩個方法,掌握了以上的使用,基本也是夠用了,下面列出一些使用中遇到的問題及解決方法:

1、如果item條目中含有Button等能獲取到焦點的子控制元件時,點選事件就會出現問題,這時我們只需要在佈局檔案的根佈局上面加上android:descendantFocusability=”blocksDescendants”,就可以解決點選事件分發的問題。

2、如果要給listView新增分頁功能,只需要給ListView新增 OnScrollListener監聽,然後在onScroll中判斷isBottom = (firstVisibleItem + visibleItemCount == totalItemCount);,如果到底底部就載入新的資料。

3、ListView需要利用Recycle機制進行優化,避免多次呼叫findViewById,具體是定義一個ViewHolder內部類,類的成員變數就是item中View的個數,然後在getView方法中判斷convertView為空的時候例項化ViewHolder,並且把其成員變數和item中的View繫結,設定一個TAG標籤,在不為空的時候利用GetTAG找到ViewHolder,然後直接給ViewHolder的成員變數設定資料即可,最後返回convertView就可以了。

4、在ListView中設定Selecter為null會報空指標,解決辦法是mListView.setSelector(new ColorDrawable(Color.TRANSPARENT))。

5、為了減少呼叫getView方法的次數,請將listview的寬高設定成fillParent或者一個具體的值。

6、如果需要改變某一項的item檢視而不是整個的檢視都改變,只需要做下面的操作:

<span style="font-size:10px;">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");
}</span>

7、如果使用一個可以摺疊的ListView可以使用expandableListView.

8、讓ListView長按時有些能彈出ContextMenu有些不能,解決這個問題的辦法是為這個listView設定setOnItemLongClickListener監聽,然後實現 :

<span style="font-size:10px;">public boolean onItemLongClick(AdapterView<?> parent, View view, 
int position, long id) { 
  if(id == 1){ 
    return true; 
  } 
  return false; 
}</span>
9、讓ListView選中和沒選中的時候字型顏色不一致,只需要給佈局檔案中的TextView設定字型顏色,顏色的內容用一個XML檔案定義,XML檔案的內容為一個selector,如下所示:
<?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> 
10、想讓一個listview的每個條目出現一個可選框,只需要使用系統的佈局檔案即可,如下面所示可以實現單選多選等:


11、每一個ListView都有兩個無效的位置,分別為第一個item的前面,和最後一個item的下一個位置,其值為一個產量,用 ListView.INVALID_POSITION表示。

12、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是指短條 

13、去掉selector選中一閃的效果:

<?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);
或者重寫isEnable()方法,返回false;
14、一些常用的屬性:

android:stackFromBottom="true" ,從後往前顯示資料。

android:transcriptMode="alwaysScroll" ,,需要用ListView或者其它顯示大量Items的控制元件實時跟蹤或者檢視資訊,並且希望最新的條目可以自動滾動到可視範圍內。通過設定的控制元件transcriptMode屬性可以將Android平臺的控制元件(支援ScrollBar)自動滑動到最底部。 

android:cacheColorHint,設定為透明色這樣在ListView拖動的時候不破壞背景色。

android:fadingEdge="none",去掉上邊和下邊的陰影。

android:scrollbars="none"或者setVerticalScrollBarEnabled(true),滾動條在不活動的時候是否隱藏。

android:fastScrollEnabled="true"或者myListView.setFastScrollEnabled(true),右邊的快速滑動條是否顯示。

掃描關注我的微信公眾號: