Android界面編程——Android高級組件

Android界面編程

Android高級UI組件

2.4.1適配器組件

適配器的作用

適配器充當適配器控件和該視圖數據之間的橋樑適配器提供訪問的數據項,並負責產生數據組中的每個項的視圖


常用的適配器

BaseAdapter:抽象類,具有較高的靈活性。

ArrayAdapter:最爲簡單,智能展示一行文字。

SimpleAdapter:有較好的擴充性,可以自定義出各種效果。

SimpleCursorAdapter:主要用於操作數據庫

 

常用的適配器控制

適配器控件擴展自ViewAdapter,是通過適配器加載數據併產生每一項的UI,常見的適配器控件如下所示:

ListView 列表顯示控件

GridView 網格控件

Spinner 下拉列表控件

ViewPager 水平分頁控件

適配器控件使用setAdapter(Adapter adapter)方法裝載適配器

 

 

2.4.2 ListView列表顯示控件

是顯示可滾動的項目的列表圖組,如圖所示的新聞列表


列表項是通過適配器產生的View,可以使用ArrayAdapterSimpleAdapterBaseAdapter設計ListView的列表項

 

下面通過實例講解ListView控件和適配器的使用

實例2.4-1:使用ArrayAdapter實現如圖





ArrayAdapter是比較簡單適配器,只能用於顯示一行文本數據。構造函數如下:

ArrayAdapter(Context context, int resource, T[] objects)

ArrayAdapter(Context context, int resource, List<T> objects)

參數說明:

resource:佈局文件,使用系統定義的佈局資源

objects:列表項數據

 

實例2.4-2:使用SimpleAdapter實現如圖





SimpleAdapter是相比ArrayAdapter比較靈活,可以列表項可以顯示多種數據。構造函數如下:

SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

Context:SimpleAdapter關聯的View的運行環境 

data :一個Map組成的List。在列表中的每個條目對應列表中的一行,每一個map中應該包含所有在from參數中指定的鍵

resource:一個定義列表項的佈局文件的資源ID。佈局文件將至少應包含那些在to中定義了的ID

from:一個將被添加到Map映射上的鍵名

to:將綁定數據的視圖的ID,跟from參數對應




實例2.4-3:使用BaseAdapter實現如圖







  1. public class NewsListAdapter extends BaseAdapter {  
  2.     private Context context;  
  3.     private List<News> newsList;  
  4.     public NewsListAdapter(Context context,List<News> newsLsit){  
  5.         this.context=context;  
  6.         this.newsList=newsLsit;  
  7.     }  
  8.     @Override  
  9.     public int getCount() {  
  10.         Log.d("jereh","NewsListAdapter-->getCount");  
  11.         return newsList!=null?newsList.size():0;  
  12.     }  
  13.     @Override  
  14.     public Object getItem(int position) {  
  15.         Log.d("jereh","NewsListAdapter-->getItem");  
  16.         return newsList.get(position);  
  17.     }  
  18.     @Override  
  19.     public long getItemId(int position) {  
  20.         Log.d("jereh","NewsListAdapter-->getItemId");  
  21.         return position;  
  22.     }  
  23.     private class ViewHolder{  
  24.         public TextView tvTitle;  
  25.         public TextView tvAuthor;  
  26.         public TextView tvTimer;  
  27.         public ImageView ivImg;  
  28.     }  
  29.     @Override  
  30.     public View getView(int position, View convertView, ViewGroup parent) {  
  31.          News news=newsList.get(position);  
  32.         ViewHolder holder=null;  
  33.         if(convertView==null){  
  34.             Log.d("jereh","NewsListAdapter-->爲列表項構建一個View");  
  35.             convertView=LayoutInflater.from(context).  
  36.                     inflate(R.layout.ch04_news_item_layout,null);  
  37.             holder=new ViewHolder();  
  38.             holder.tvTitle=(TextView)convertView.findViewById(R.id.tvTitle);  
  39.             holder.tvAuthor=(TextView)convertView.findViewById(R.id.tvAuthor);  
  40.             holder.tvTimer=(TextView)convertView.findViewById(R.id.tvTime);  
  41.             holder.ivImg=(ImageView)convertView.findViewById(R.id.ivImg);  
  42.             convertView.setTag(holder);  
  43.         }else{  
  44.             holder= (ViewHolder)convertView.getTag();  
  45.         }  
  46.         holder.tvTitle.setText(news.getTitle());  
  47.         holder.tvAuthor.setText(news.getAuthor());  
  48.         holder.ivImg.setImageResource(news.getImageRes());  
  49.         long timer=news.getTime();  
  50.         String timeFlag="";  
  51.         if(timer<1000*60*5){  
  52.             timeFlag="剛剛";  
  53.         }else if(timer<1000*60*60){  
  54.             timeFlag="一小時之前";  
  55.         }else {  
  56.             Date date=new Date(new Date().getTime()-timer);  
  57.             SimpleDateFormat sdf=new SimpleDateFormat("MM月dd日");  
  58.             timeFlag=sdf.format(date);  
  59.         }  
  60.         holder.tvTimer.setText(timeFlag);  
  61.         return convertView;  
  62.     }  
  63. }  

自定義適配類的實現

1、編寫適配類,擴展BaseAdapter

public class NewsListAdapter extends BaseAdapter

2、編寫構造函數, 傳入適配器所需的數據和Context

  public NewsListAdapter(Context context,List<News> newsLsit)

3、重寫BaseAdapter的方法

Ø int getCount():  返回總數據量

Ø Object getItem(int position):根據position得到一項數據

Ø long getItemId() :得到某一行的id

Ø View getView(int postion,View convertView,ViewGroup parent)    

產生列表一項的View並填充數據,返回產生的視圖

ViewHolder機制

爲了提高ListVew的產生View的效率,複用已存在的View,減少UI的創建次數,而採用的優化方案

1、 編寫ViewHolder類,定義列表項所需的UI元素

private class ViewHolder{

        public TextView tvTitle;

        public TextView tvAuthor;

        public TextView tvTimer;

        public ImageView ivImg;

}

2、 若convertView爲空時創建UI,並使用ViewHolder實體引用列表項中產生的UI,若converView不爲空,則不需要創建,使用保存在ViewHolder實體中UI即可。代碼片段如下:

if(convertView==null){

            convertView=LayoutInflater.from(context).

                    inflate(R.layout.ch04_news_item_layout,null);

            holder=new ViewHolder();

            holder.tvTitle=(TextView)convertView.findViewById(R.id.tvTitle);

            holder.tvAuthor=(TextView)convertView.findViewById(R.id.tvAuthor);

            holder.tvTimer=(TextView)convertView.findViewById(R.id.tvTime);

            holder.ivImg=(ImageView)convertView.findViewById(R.id.ivImg);

            convertView.setTag(holder);

        }else{

            holder= (ViewHolder)convertView.getTag();

        }






2.4.3 GridView控件

以行和列的方式顯示可滾動網格控件,網格中的每一項由ListAdapter與視圖之間的關聯產生。典型應用如圖所示的“九宮格”效果:


2.4.3-1列出了GridView常用的屬性和方法。

表2.4.3-1GridViewL屬性和方法

XML屬性

備註

Android:numColumns

numauto_fit

指定GridView的列數個數,可設置爲自動

android:columnWidth

dp

每列的寬度,也就是Item的寬度

android:stretchMode

columnWidth

設置縮放模式,與列寬大小同步

android:verticalSpacing

dp

兩行之間的邊距

android:horizontalSpacing

dp

兩列之間的邊距

android:cacheColorHint

#00000000

去除拖動時默認的黑色背景

android:scrollbars

noneverticalhorizontal

設置GridView的滾動條的顯示方式

 

下面通過實例講解一下GridView的使用

實例2.4.3-1,使用GridView實現如如圖的圖片牆效果









2.4.4 Spinner控件

下拉選項控件,爲用戶提供了一個快速的方法來選擇一組一個值,如圖2.4.4-1所示點選Spinner將顯示與所有其他可用的值,用戶可以選擇一個新的下拉選項。

 

 

圖2.4.4-1

Spinner控件也屬於適配器控件,與之前的ListViewGridView控件使用十分相似,一個關鍵點就是編寫Adapter,下面通過實例講解一下Spinner的使用





2.4.5 ViewPager控件

橫向滑動的分頁控件應用十分廣泛的組件之一,常見應用有不同頻道的左右滑動顯示,可橫向翻動的圖片等。ViewPager專屬適配器PagerAdapter,通過提供一個的實現 PagerAdapter的適配器生成該視圖顯示的每個顯示頁面

ViewPager最常配合使用片段,這是一種方便的方式來提供和管理每個片段的生命週期。並提供了實施ViewPager片段的標準適FragmentPagerAdapter和 FragmentStatePagerAdapter

ViewPager實現步驟:

1、 佈局文件中加入ViewPager控件

2、 編寫適配器——實現PagerAdapter

3、 使用setAdapter()加載適配器

 

2.4.5-1PagerAdapter適配器的方法及其作用。

表2.4.5-1PagerAdapter方法和作用

方法

作用

 int getCount()

返回翻轉頁面的個數

boolean isViewFromObject(View view, Object  obj)

用於判斷對象是否是用於呈現在ViewPager的View組件

Object instantiateItem(View Container, int position)

返回ViewPager的一頁

void destroyItem(ViewGroup container, int position, Object object)

從ViewGroup中移出View

下面通過實例逐步掌握ViewPager的使用。

實例2.4.5-1,使用ViewPager實現如圖所示的新聞圖片瀏覽界面。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章