學習筆記|AS入門(五) 高級控件篇(上)

在以前的學習中咱們接觸到了一些簡單經常使用的控件和監聽器,但這些在實際開發中是遠遠不夠的,接下來一塊兒來認識更高級的控件和更豐富的監聽器,以及學會如何使用適配器搭建起數據源和視圖界面的橋樑。高級控件篇第的一部分將圍繞適配器講解它是如何在某些高級控件發揮重要做用。本篇控件清單:

  • ListView 列表
  • Spinner 下拉列表
  • GridView 網格視圖
  • ViewPager 視圖滑動切換工具

那什麼是數據適配器Adapter呢?如開頭所說,它的做用是把複雜的數據填充在指定視圖界面上。經常使用兩種Adapter: ArrayAdapter(用於綁定單一的數據,數據源是數組或集合)SimpleAdapter(用於綁定格式複雜的數據,數據源是特定的泛型集合)。接下來將以ListView爲例,看看這兩種適配器的使用方法和效果。

1.ListView 列表python

ListView是最爲經常使用的控件之一,它以列表的形式展現具體內容,而且可以根據數據的長度自適應顯示。下圖是一個每項數據只有一行文本的ListView效果圖,對於這類單一數據,用ArrayAdapter加載數據再合適不過,接下來一塊兒學習一下。android

佈局界面只須要一個ListView,設置好寬高和id就夠了。另外,還經常使用屬性android:divider設置列表分割線的顏色,如透明色 #00000000.數組

在MainActivity用id找到佈局中的ListView以後,就是加載適配器的過程了:緩存

能夠看到使用過程無非三個步驟:數據源準備->適配器加載數據源->控件加載適配器,在關鍵的第二步對ArrayAdapter初始化中,提供的三個參數完成了在哪裏顯示、每一項數據如何顯示(這裏直接使用安卓提供好一個佈局)、顯示哪些數據及有多少項這些任務,再set到ListView上,就實現了一開始看到的界面效果。因此ListView只負責加載和管理視圖,其餘顯示內容都是交給Adapter去作的。app

固然ListView的每一項Item都是能夠被監聽的,監聽器是OnItemClickListener,其中返回的參數position表示被點擊的某項在整個List中的位置,從0起算,這樣就能用ListView的getItemAtPosition()方法獲取到被點擊項的內容:ide

當點擊第一項「wifi」時效果以下:函數

接下來再看一個頁面效果:工具

在這個ListView能看到每一個Item再也不是簡單的一行,有文字也有圖片,這種格式複雜的數據就要用到SimpleAdapter了,仍是在main.xml裏準備好ListView控件,再回到MainActivity來學習如何用以前學會的三步驟來加載SimpleAdapter吧!佈局

第一步準備數據源,能夠看到數據源dataList是一個特定的泛型集合,這裏String表明文字,Object表明圖片,而後調用getData()初始化dataList。post

每個Map對應一項Item,爲了方便用for循環讓每一個Item裏圖標都同樣,文字內容遞增就能夠,而後添加到dataList,這樣就完成一個有20項Item的List。這裏注意Map鍵值對裏的鍵名,後面會須要。

第二步適配器加載數據源,在此以前,須要給列表每一項作個佈局item.xml,這個不難理解,由於在ArrayAdpter例子裏咱們直接使用系統提供的佈局而已。注意要給出TextView和ImageView的id,立刻就會用到。

如今又到了關鍵一步,SimpleAdapter初始化比較複雜,須要用到五個參數,前三個容易理解,後兩個就是以前須要留心的兩個要點。這一步實現了控件與數據的一一綁定。最後一步加載適配器就大功告成了!

如今再介紹ListView上經常使用的監聽器OnScrollListener,用於監聽滾動變化,當用戶拉到列表最底下的時候可幫助視圖在滾動中加載數據。如今爲列表設置監聽器listView.setOnScrollListener(this),並實現onScrollStateChanged ()、onScroll()方法。

這裏重寫第一個方法,能看到事件會返回一個scrollState,它有三個狀態值,下圖打印出詳細描述。由於須要在視圖一直滑動到底端給出新的Item,爲dataList增添新的map以後,要用到adpter很是關鍵的方法**notifyDataSetChanged()**通知適配器數據發生了變化要從新加載數據,這再次印證以前所說數據的顯示是適配器的工做而不是列表。

效果以下,能夠看到當用戶看完20項繼續向下拖時就會有源源不斷的新內容更新上來。

學完這兩個經常使用適配器使用和適用狀況以後,對比可看出ArrayAdapter使用起來明顯簡單許多,思考一個問題,ArrayAdapter的第二個參數若是不用系統提供的列表項佈局而是自定義佈局,是否也能作到圖文並存的效果呢?答案是確定的,只不過須要自定義一個適配器繼承ArrayAdapter並重寫一些方法了。下面就來學習如何定製一個ListView界面吧!

此次作一個更好看的界面,準備好小動物的圖片就能夠開始大展身手了!

回憶一下實例化一個ArrayAdapter時須要的三個參數,其中列表項佈局以及適配器的適配類型都是要從新考慮的。那麼先就從這開始準備吧!

每一個Item都是由左邊一張圖片和右邊一行文本組成的,下面代碼中須要解釋的是使用 tools: 的屬性在咱們預覽能看到效果但不會出如今運行後的佈局,方便咱們提早看效果又不至於影響後續工做。

接着須要準備一個實體類Animal做爲適配器的適配類型,這個類裏提供動物圖片和名稱兩個屬性、用來初始化屬性的構造方法以及對應的get方法便可。

而後到了關鍵一步,建立一個自定義的適配器且繼承ArrayAdapter,重寫父類一組含三個參數的構造函數,並將列表項子佈局的id保存下來。接着重寫getView()方法,先用getItem(position)獲得當前Item項的Animal實例,再用LayoutInflater系列方法把子佈局傳入當前佈局獲得一個View,接着調用這個View的findViewById()找到ImageView和TextView實例,這樣就能夠把從當前項對象get的內容設置到這兩個控件裏去顯示圖片和文字了。

一切準備就緒以後,後面的步驟基本信手拈來了,相信下面這段代碼你必定沒問題了。

點擊某個Item也會有響應:

這裏對getView()多提幾句,若是咱們只是用上面幾行代碼來運行ListView的話效率會很是低,由於每次爲了要顯示每一個子項去調用getView()方法後都會將佈局從新加載一遍,若是能將顯示過的Item View緩存起來,之後出現直接複用就能達到提高ListView運行效率的效果了。優化後代碼以下:

如下是源代碼:

public View getView(int position, View convertView, ViewGroup parent) {
        Animal animal=getItem(position);
        View view;
        ViewHolder viewHolder;
        if(convertView==null){
            view=LayoutInflater.from(getContext()).inflate(resourceId, null);
            viewHolder=new ViewHolder();
            viewHolder.imageView= (ImageView) view.findViewById(R.id.animal_image);
            viewHolder.textView= (TextView) view.findViewById(R.id.animal_name);
            view.setTag(viewHolder);
        }else{
            view=convertView;
            viewHolder = (ViewHolder) view.getTag();
        }

        viewHolder.textView.setText(animal.getAnimalName());
        viewHolder.imageView.setImageResource(animal.getImageId());
        return view;
    }

    class ViewHolder{

        ImageView imageView;
        TextView textView;
    }
}
複製代碼

到此學了這麼多,相信你對適配器能夠熟練使用了吧!只要三步就搞定。想必在其餘控件上應用適配器也很容易了,下面快來再認識兩個高級控件。

2.Spinner 下拉列表

與ListView相似的,每一個下拉列表項對應一個Item,列表項內容通常是文字,用ArrayAdapter就能作到,舉一反三,相信作一個下圖所示的下拉列表已經難不倒你了!

選擇系統提供的一個佈局做爲Spinnner的菜單樣式,注意是設置在適配器上,這裏給Spinner安裝監聽器是OnItemSelectListener,用適配器和列表均可以定位到某Item,完成後效果以下:

3.GridView 網格視圖

從名字中能看出來GridView的特色,它使得每一個Item以網格的形式展示,除此以外使用方式和ListView很是類似。下面準備用SimpleAdapter作一個這樣的Demo:

GirdView自己還有些經常使用的屬性: android:verticalSpacing(兩列之間的間距),android:horizontalSpacing(兩行之間的間距), android:numColumns(每行顯示多少列,選值爲auto_fit表示自動適應展現幾列)。

接下來就是GridView綁定SimpleAdapter的過程了,再也不細說,須要強調這裏把圖標和文字分別放在兩個數組中且一一對應以便能經過循環獲得數據源dataList。監聽器是OnItemClickListener

最後爲了界面美觀,在註冊該活動時候設置theme是Black且NoTitleBar,注意被設置成**android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"**的活動必定繼承的是android.app包下Activity,若是是V7兼容包下的AppCompatActivity會致使程序崩潰沒法打開。點擊運行來看看是否是達到上面的效果了呢?

其實除了這兩個經常使用Adatper,還有一些Adapter也實用,下面經過ViewPager控件再來認識一個Adapter。

4.ViewPager 視圖滑動切換工具

ViewPager是android擴展包v4包中的類,這個類可讓用戶左右切換當前的視圖(View、Fragment均可以),不少APP都用到這個功能,可見其重要程度,所以想用這點篇幅詳解ViewPager是徹底不夠的,這裏就僅僅給你們介紹用來幫助ViewPager管理View數據源的適配器PagerAdapter,感覺一下風格各樣的適配器。

首先在佈局裏導入v4包兩個控件,其中PagerTabStrip是ViewPager子標籤,包含在ViewPager裏,這裏用它做標題。

因爲PagerAdapter是抽象類,使用時須要自定義子類。初始化時讓這個適配器獲取到兩個數據源List:頁卡List和標題List,以後重寫幾個方法更好的完善這個適配器的功能。

接着三步驟,在主活動準備好兩個List,這裏用View.inflate ()方法將佈局轉化成View對象,數據加載到自定義適配器上,adapter加載到ViewPager便可,又給ViewPager設置監聽器OnPageChangeListener監聽頁卡是否發生變化。另外,咱們還獲取到控件PagerTabStrip去給標題作些美化工做。

最後效果如圖,手指左右滑動就能夠實現頁面切換了。

其實全部這些Adapter都是從父類BaseAdapter擴展而來的,也就是說咱們也能夠根據本身的須要自定義一個Adapter繼承BaseAdapter,而後具體實現下面4個方法:

因爲adapter中含有要顯示的數據集合,數據集合中元素個數便可被展現的View個數,每一個數據的獲取、每一個Item View的樣式都由adapter控制,每一個position位置上數據都綁定到Item View上,這樣數據和視圖也就結合在一塊兒了。因爲篇幅緣由不在這裏接着具體展開,後續再深刻探究。

本篇先到這裏,下一篇還有更多有趣的高級控件等咱們學習~

相關文章
相關標籤/搜索