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 |
num、auto_fit |
指定GridView的列數個數,可設定為自動 |
android:columnWidth |
dp |
每列的寬度,也就是Item的寬度 |
android:stretchMode |
columnWidth |
設定縮放模式,與列寬大小同步 |
android:verticalSpacing |
dp |
兩行之間的邊距 |
android:horizontalSpacing |
dp |
兩列之間的邊距 |
android:cacheColorHint |
#00000000 |
去除拖動時預設的黑色背景 |
android:scrollbars |
none、vertical、horizontal |
設定GridView的滾動條的顯示方式 |
下面通過例項講解一下GridView的使用
例項2.4.3-1,使用GridView實現如如圖的圖片牆效果
2.4.4 Spinner控制元件
下拉選項控制元件,為使用者提供了一個快速的方法來選擇一組一個值,如圖2.4.4-1所示點選Spinner將顯示與所有其他可用的值,使用者可以選擇一個新的下拉選項。
圖2.4.4-1
Spinner控制元件也屬於介面卡控制元件,與之前的ListView、GridView控制元件使用十分相似,一個關鍵點就是編寫Adapter,下面通過例項講解一下Spinner的使用