Android 之 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表示右圖右上角的圖片
      }

  非常easy吧。你們能夠試試。

  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中該載入框的設計例如以下:  

<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。地址:http://www.kuaipan.cn/file/id_37676161790126914.html


原文鏈接:http://www.cnblogs.com/carmanloneliness/archive/2012/05/29/android_%E8%B6%A3%E5%91%B3%E7%9A%84gridView%E6%8E%A7%E4%BB%B6.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM