GridView的監聽,選擇,美化等詳解
工作這麼久以來,都是以解決需求為目標。漸漸發現這種學習方式不好,學到的知識能馬上解決問題,但沒有經過梳理歸納。故想係統總結下一些有趣味的知識點。在這篇博客中想以一個例子係統講解下GridView控件涉及到的方方麵麵,比如監聽,背景圖的設置等。
1.控件屬性介紹
android:listSelector="@drawable/bg"
//該屬性很重要,如果不設置的話,GridView控件會自帶自己的選中樣式(黃色邊框),如圖所示:
做項目一般是不需要這個的。所以解決辦法是將GridView的android:listSelector屬性設置為和Activity背景相同即可。
android:verticalSpacing="10dp" //行寬
android:horizontalSpacing="10dip" //列寬
android:numColumns="3" //列數
android:stretchMode="columnWidth" //列可擴展
以上列數為3,若想在高分辨率中列數設置為4怎麼辦呢。
首先,需要在屬性中設置列為可擴展android:stretchMode="columnWidth"。然後在代碼中做個判斷:
if(Metrics.heightPixels == 1280 && Metrics.widthPixels == 800){
gridview.setNumColumns(4);
}這樣GridView的列數是可以隨分辨率不同而做更多的設置。
2.例子一:設置個邊框,並且右上角設置個CheckBox來美化選中狀態(左圖→右圖)。
→→→
這個Item的xml設計中,我是用兩個ImageView控件來實現的.
第一個ImageView 要設置一個屬性:android:layout_margin="4dip"。上下左右留出4dip的具體來顯示邊框的效果。並且在相應的Adapter中做個判斷,選中的話背景圖片顏色為#87CEFA,未選中時為3FFFFFF:
if(bSelect){ //bSelect表示是否選中
arg1.setBackgroundColor(Color.parseColor("#87CEFA"));
}else{
arg1.setBackgroundColor(Color.parseColor("#FFFFFF"));
右上角的看起來像複選框,其實我也是用ImageView控件來實現的。界麵設計很重要,距離要對好。我設置的該控件離上邊距和右邊距分別為2dip的距離。同樣的隻需要修改該ImageView所綁定的圖片就可以。
if(bSelect){
viewclass.checkboxImage.setImageBitmap(bmpwater_sel); //bmpwater_sel表示左圖右上角的圖片
}else{
viewclass.checkboxImage.setImageBitmap(bmpwater_unsel); //bmpwater_unsel表示右圖右上角的圖片
}
很簡單吧。你們可以試試。
3.例子二:打開一個GridView控件的Activity時,如果打開的圖片過多,如何讓圖片異步加載。如圖所示:
→
首先在界麵定義中要定義一個全屏顯示的加載圈效果,叫做mLoading。程序剛啟動時顯示圖片加載結束後調用函數mLoading.setVisibility(View.GONE);讓它不顯示。我是用一個函數來調用它,這樣更好的體現了封裝性,如下:
private void showLoading(boolean bShow){
if(mLoading == null) return;
mLoading.setVisibility(bShow ? View.VISIBLE : View.GONE);
}
xml中該加載框的設計如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<span
style= "font-size:
13px;" ><RelativeLayout
android:id= "@+id/video_tip_layout"
android:layout_width= "fill_parent" android:layout_height= "fill_parent" >
<ProgressBar
style= "?android:attr/progressBarStyleLarge"
android:layout_width= "wrap_content" android:id= "@+id/video_tip_progressbar"
android:layout_height= "wrap_content" android:layout_centerVertical= "true"
android:layout_centerHorizontal= "true" />
<TextView
android:textAppearance= "?android:attr/textAppearanceMedium"
android:id= "@+id/video_tip_text" android:text= "加載中..."
android:layout_width= "wrap_content" android:layout_height= "wrap_content"
android:layout_below= "@+id/video_tip_progressbar"
android:textColor= "#808080"
android:layout_centerHorizontal= "true" ></TextView>
</span>
|
①為了不卡主線程,實現這一的效果要多開一個線程。在該線程中調用函數InitList(),在該函數中將圖片加載到ArrayList中去(花時間最多的就是對多圖片的處理,這個放在子線程中可以不卡主線程,如果直接在主線程中做,會讓畫麵出現2-3秒的黑屏停頓)。
像這樣,在onCreate方法中開一個子線程:
new Thread(new Runnable() {
@Override
public void run() {
InitList();
}
}).start();
②方法InitList()中要做兩件事情。一是加載圖片,二是通知Handler圖片加載完成(因為子線程不可以操作UI控件,隻能通過Handler的方式)。
private void InitList()
{
XXXX; //加載圖片代碼
mMainHandler.sendMessage(MainHandler.MSG_FINISH); //發送消息
}
③當收到InitList發送的消息時就讓上麵所提的mLoading不顯示。同時GridView綁定adapter的代碼也在這個裏麵寫。因為圖片加載完成後再綁定adapter,這樣圖片才能全部顯示,否則隻能顯示一部分。
case MSG_FINISH:
showLoading(false); //讓加載框不再顯示
gridview.setAdapter(ia); //綁定數據
break;
default:
break;
提供幾張我們專業設計師做的美圖,大家可以下載素材嚐試一下,做個demo。地址:https://www.kuaipan.cn/file/id_37676161790126914.html
最後更新:2017-04-02 15:28:25
上一篇:
ListView中getView中放置多個item和getItemViewType的用法
下一篇:
POJ2965高消+搜索
6月13日雲棲精選夜讀:【幹貨】iOS 11 短信攔截功能初探
Kafka詳解五、Kafka Consumer的底層API- SimpleConsumer
三星如何掙脫諾基亞魔咒?
第四屆中國國際大數據大會務實推進應用落地
AI翻譯離無障礙交流有多遠
SQL語句中where 1=1的基本用法
不損害2D層狀BP材料電學性能的創新技術:單能離子能量Ar+離子束減薄工藝
14個你可能不知道的JavaScript調試技巧
Android-----使用Button特效selector+shape
WebService報錯javax.xml.ws.soap.SOAPFaultException: javax.xml.ws.WebFault.messageName()