Android應(yīng)用界面開發(fā)
第二章學(xué)習(xí)
第二部分####
1.繼續(xù)分析Adapter的常用類
上一篇文章使用了ArrayAdapte制作了一個只由簡單的文字組成的ListView涂籽,那ArrayAdapter是不是只有簡單顯示一行文字的功能呢乐导?答案是否定的。
public class ArrayAdapter<T> extends BaseAdapter implements Filterable, ThemedSpinnerAdapter {...}
發(fā)現(xiàn)袜漩,既然ArrayAdapter是接受泛型的搔涝,那其實(shí)什么樣的類都能傳給它着裹,并且它繼承自BaseAdapter揉忘,可使用的方法很多最疆。
包含泛型List的構(gòu)造方法:
public ArrayAdapter(Context context, int resource, List<T> objects)
其它上一篇都說了,這次不使用數(shù)組隐孽,而使用一個泛型集合List< T > objects癌椿,并且去掉了一個構(gòu)造參數(shù)int textViewResourceId (也就是textView的ID)健蕊,這次不只針對單行的文本菱阵,所以只有這個參數(shù)不夠用呀,你當(dāng)然也可以填滿4個參數(shù)缩功,默認(rèn)值就為0晴及,表示無。
自己思考后嫡锌,畫了2張圖虑稼,原創(chuàng)的!
其實(shí)势木,在數(shù)據(jù)源中每一個object(包含各種Java類)蛛倦,在ListView中對應(yīng)著每一個item(列表中的每一個橫行)
而Java類中的對應(yīng)的變量,則可以一 一對應(yīng)與item布局文件中的各個屬性啦桌。
來溯壶,編代碼及皂,存在一個Data類,表示每一個Item包含的內(nèi)容且改。
public class Data {
private String Text; //需要顯示的文字
private int ImageId; //需要顯示的圖片資源編號
public Data(String text, int imageId) {
Text = text;
ImageId = imageId;
}
public String getText() {
return Text;
}
public int getImageId() {
return ImageId;
}
}
接下來需要編寫一個自定義ArrayAdapter< Data >類验烧,用于處理Data變量與控件屬性的關(guān)系。
public class DataAdapter extends ArrayAdapter<Data> {
int mResourceId;
public DataAdapter(Context context, int resource, List<Data> objects) {
super(context, resource, objects); //調(diào)用ArrayAdapter的構(gòu)造方法
mResourceId = resource; //獲取list的布局文件
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//重寫getView方法
Data mData = getItem(position);
//獲取此Data
ViewHolder mViewHolder;
if (convertView == null){
//如果view未被創(chuàng)建過又跛,且緩存為空
mViewHolder = new ViewHolder();
convertView= LayoutInflater.from(getContext()).inflate(mResourceId,null);
//此時(shí)碍拆,將mResourceId轉(zhuǎn)換成了View類
/*其實(shí)LayoutInflater.from(Context context)方法,就是包含下列參數(shù)的靜態(tài)方法
/LayoutInflater LayoutInflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
獲得了系統(tǒng)的布局解析服務(wù)*/
//inflate的第一個參數(shù)是布局文件Id慨蓝,第二個ViewGroup對象感混,在創(chuàng)建單獨(dú)的view的時(shí)候,只需要填null
mViewHolder.textView = (TextView)convertView.findViewById(R.id.textView);
mViewHolder.image = (ImageView) convertView.findViewById(R.id.image);
//通過convertView找到其中的控件
convertView.setTag(mViewHolder);
//將ViewHolder類存儲到已經(jīng)實(shí)例化的convertView中
}else {
//如果convertView有值
mViewHolder = (ViewHolder) convertView.getTag();
//從convertView中拿到ViewHolder類礼烈,從而可以使用其中的對象
}
mViewHolder.textView.setText(mData.getText());
mViewHolder.image.setImageResource(mData.getImageId());
//通過實(shí)例化后的Data數(shù)據(jù)浩习,獲取相應(yīng)函數(shù),進(jìn)行屬性的賦值
return convertView;
}
class ViewHolder{
//創(chuàng)建一個類济丘,用于保存實(shí)例化的對象
TextView textView;
ImageView image;
}
}
其中position是item的順序編號谱秽,此編號與List< Data>中的Data位置相同
其它不難理解,在其中創(chuàng)建了一個內(nèi)部類ViewHolder摹迷,因?yàn)檎{(diào)用getview方法時(shí)疟赊,不需要每次都創(chuàng)建textView等屬性的實(shí)例,只需要第一次創(chuàng)建時(shí)峡碉,將實(shí)例創(chuàng)建在ViewHolder內(nèi)部近哟;利用View的setTag方法,可將一些類型的實(shí)例存儲于其中鲫寄,并隨著view的傳遞而傳遞吉执,在需要使用是,利用getTag方法取出地来。
貼上剩下的代碼
Class FirstAty
public class FirstAty extends AppCompatActivity {
private ArrayList<Data> mList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first_aty);
initData();
//初始化數(shù)據(jù)
DataAdapter DataAdapter = new DataAdapter(FirstAty.this,R.layout.list_layout,mList);
//實(shí)例化適配器
ListView listView = (ListView) findViewById(R.id.list_view);
//通過id實(shí)例化ListView
listView.setAdapter(DataAdapter);
//關(guān)聯(lián)listView與適配器
}
private void initData() {
mList = new ArrayList<>();//創(chuàng)建數(shù)據(jù)源的容器
mList.add(new Data("camera",R.drawable.camera));
mList.add(new Data("games_control",R.drawable.games_control));
mList.add(new Data("ringtone",R.drawable.ringtone));
mList.add(new Data("settings",R.drawable.settings));
mList.add(new Data("speech_balloon",R.drawable.speech_balloon));
}
}
activity_first_aty.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:gravity="center_horizontal"
tools:context="comeinsteinford.github.firstapplication.FirstAty">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list_view">
</ListView>
</RelativeLayout>
list_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:id="@+id/image"
android:contentDescription="@string/text01"
android:padding="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:id="@+id/textView"
android:padding="10dp"/>
</LinearLayout>
這幾個代碼基本上也沒變戳玫,我只是在工程目錄下放置了一些圖片,用于listview中顯示未斑,當(dāng)然Data類與list_layout中的控件是一一對應(yīng)的咕宿,可以添加其它兩邊都可適配的各類控件及屬性。
運(yùn)行效果如下
文章太長容易讓人看不下去蜡秽,今天就到這里吧府阀。