ListView 特殊屬性 & 常見問題
這里向大家介紹一些我個人認為比較 特別的屬性,通過設置這樣的屬性可以做出更加美觀的列表
一. ListView的一些特殊屬性
1. stackFromBottom屬性
android:stackFromBottom="true"酿炸。設置該屬性后你做好的列表就會顯示你列表的最下面瘫絮,值為true和false
2. transciptMode屬性
需要用ListView或者其它顯示大量Items的控件實時跟蹤或者查看信息,并且希望最新的條目可以自動滾動到可視范圍內(nèi)填硕。通過設置的控件transcriptMode屬性可以將Android平臺的控件(支持ScrollBar)自動滑動到最底部麦萤。
android:transcriptMode="alwaysScroll"
3. cacheColorHint屬性
很多人希望能夠改變一下它的背景,使他能夠符合整體的UI設計扁眯,改變背景背很簡單只需要準備一張圖片然后指定屬性 android:background="@drawable/bg"壮莹,不過不要高興地太早,當你這么做以后姻檀,發(fā)現(xiàn)背景是變了命满,但是當你拖動,或者點擊list空白位置的時候發(fā)現(xiàn)ListItem都變成黑色的了绣版,破壞了整體效果胶台。
如果你只是換背景的顏色的話狭莱,可以直接指定 android:cacheColorHint 為你所要的顏色,如果你是用圖片做背景的話概作,那也只要將android:cacheColorHint指定為透明(#00000000)就可以了
4. divider屬性
該屬性作用是每一項之間需要設置一個圖片做為間隔腋妙,或是去掉item之間的分割線
android:divider="@drawable/list_driver" 其中 @drawable/list_driver 是一個圖片資源,如果不想顯示分割線則只要設置為android:divider="@drawable/@null" 就可以了讯榕。android:dividerHeight="2dip" 設置兩個item之間的距離
5. headerDividersEnabled屬性
android:headerDividersEnabled="false"設成flase時骤素,此ListView將不會在頁眉視圖前畫分隔符。缺省值為true
android:footerDividersEnabled 設成flase時愚屁,此ListView將不會在頁腳視圖前畫分隔符济竹。此屬性缺省值為true
6. fadingEdge屬性
上邊和下邊有黑色的陰影(類似邊框的東西)
android:fadingEdge="none" 設置后沒有陰影了~
7. scrollbars屬性
作用是隱藏listView的滾動條,
android:scrollbars="none"與setVerticalScrollBarEnabled(true);的效果是一樣的霎槐,不活動的時候隱藏送浊,活動的時候也隱藏
8. fadeScrollbars屬性
android:fadeScrollbars="true" 配置ListView布局的時候,設置這個屬性為true就可以實現(xiàn)滾動條的自動隱藏和顯示丘跌。
9. fastScrollEnabled屬性
很多開發(fā)者不知道ListView列表控件的快速滾動滑塊是如何啟用的袭景,這里告訴大家,輔助滾動滑塊只需要一行代碼就可以搞定闭树,如果你使用XML布局只需要在ListView節(jié)點中加入 android:fastScrollEnabled="true" 這個屬性即可耸棒,而對于Java代碼可以通過myListView.setFastScrollEnabled(true)來控制啟用,參數(shù)false為隱藏报辱。 還有一點就是當你的滾動內(nèi)容較小与殃,不到當前ListView的3個屏幕高度時則不會出現(xiàn)這個快速滾動滑塊,同時該方法仍然是AbsListView的基礎方法碍现,可以在ListView或GridView等子類中使用快速滾動輔助幅疼。
10. drawSelectorOnTop屬性
android:drawSelectorOnTop="true" 點擊某一條記錄,顏色會顯示在最上面昼接,記錄上的文字被遮住爽篷,所以點擊文字不放,文字就看不到
android:drawSelectorOnTop="false"點擊某條記錄不放辩棒,顏色會在記錄的后面狼忱,成為背景色膨疏,但是記錄內(nèi)容的文字是可見的
11. listSelector屬性
android:listSelector="#00000000 " 改變選中item時的顏色一睁。默認為橙黃底色(依手機系統(tǒng)而定)
12. scrollingCache屬性
android:scrollingCache="false"去除拖動時ListView背景為黑色
13. soundEffectsEnabled屬性
android:soundEffectsEnabled="false" 點擊和觸摸時是否有聲音效果,缺省值為true(只有系統(tǒng)設置中開啟了觸摸提示音才有效)
二. 解決ListView item中含有Button或者Checkable的子類控件點擊時沖突
由于在你自己定義的Item中存在諸如Button或者Checkable的子類控件,此時這些子控件會將焦點獲取到佃却,所以常常當點擊item時變化的是子控件者吁,item本身的點擊沒有響應。這時候就可以使用descendantFocusability來解決啦饲帅,API描述如下:
該屬性是當一個為view獲取焦點時复凳,定義viewGroup和其子控件兩者之間的關系瘤泪。
屬性的值有三種:
- beforeDescendants:viewgroup會優(yōu)先其子類控件而獲取到焦點
- afterDescendants:viewgroup只有當其子類控件不需要獲取焦點時才獲取焦點
- blocksDescendants:viewgroup會覆蓋子類控件而直接獲得焦點
所以解決辦法:
- 在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的屬性。
- 在當前ListView的xml里添加android:descendantFocusability=”blocksDescendants” 在item的xml里的Button添加android:focusable="false"的屬性育八。
三. listview的item點擊事件會使里面的Button也出現(xiàn)按壓的效果
兩個方案:
- 放棄listview的onItemClickedListener()对途。listview.setOnItemClickedListener(null);
- 使用自定義的Button,判斷他的父控件是否press髓棋,如果是就把這個事件消耗掉实檀,不向下傳遞即可;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
public class CustomButton extends Button {
public CustomButton(Context context) {
super(context);
}
public CustomButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void setPressed(boolean pressed) {
if (pressed && getParent() instanceof View && ((View) getParent()).isPressed()) {
return;
}
super.setPressed(pressed);
}
}
參考來源:
“一勤天下無難事” 博客
CSDN博客