1. 程式人生 > >Android介面程式設計——Android高階UI元件(三)

Android介面程式設計——Android高階UI元件(三)

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實現如圖







public class NewsListAdapter extends BaseAdapter {
    private Context context;
    private List<News> newsList;
    public NewsListAdapter(Context context,List<News> newsLsit){
        this.context=context;
        this.newsList=newsLsit;
    }
    @Override
    public int getCount() {
        Log.d("jereh","NewsListAdapter-->getCount");
        return newsList!=null?newsList.size():0;
    }
    @Override
    public Object getItem(int position) {
        Log.d("jereh","NewsListAdapter-->getItem");
        return newsList.get(position);
    }
    @Override
    public long getItemId(int position) {
        Log.d("jereh","NewsListAdapter-->getItemId");
        return position;
    }
    private class ViewHolder{
        public TextView tvTitle;
        public TextView tvAuthor;
        public TextView tvTimer;
        public ImageView ivImg;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
         News news=newsList.get(position);
        ViewHolder holder=null;
        if(convertView==null){
            Log.d("jereh","NewsListAdapter-->為列表項構建一個View");
            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();
        }
        holder.tvTitle.setText(news.getTitle());
        holder.tvAuthor.setText(news.getAuthor());
        holder.ivImg.setImageResource(news.getImageRes());
        long timer=news.getTime();
        String timeFlag="";
        if(timer<1000*60*5){
            timeFlag="剛剛";
        }else if(timer<1000*60*60){
            timeFlag="一小時之前";
        }else {
            Date date=new Date(new Date().getTime()-timer);
            SimpleDateFormat sdf=new SimpleDateFormat("MM月dd日");
            timeFlag=sdf.format(date);
        }
        holder.tvTimer.setText(timeFlag);
        return convertView;
    }
}

自定義適配類的實現

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的使用