Adapter與ListView的簡單應(yīng)用(下)

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晴及,表示無。

ListView01

自己思考后嫡锌,畫了2張圖虑稼,原創(chuàng)的!

其實(shí)势木,在數(shù)據(jù)源中每一個object(包含各種Java類)蛛倦,在ListView中對應(yīng)著每一個item(列表中的每一個橫行)

ListView02

而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)行效果如下

運(yùn)行效果

文章太長容易讓人看不下去蜡秽,今天就到這里吧府阀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芽突,隨后出現(xiàn)的幾起案子试浙,更是在濱河造成了極大的恐慌,老刑警劉巖寞蚌,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件田巴,死亡現(xiàn)場離奇詭異力细,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)固额,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門眠蚂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斗躏,你說我怎么就攤上這事逝慧。” “怎么了啄糙?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵笛臣,是天一觀的道長。 經(jīng)常有香客問我隧饼,道長沈堡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任燕雁,我火速辦了婚禮诞丽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拐格。我一直安慰自己僧免,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布捏浊。 她就那樣靜靜地躺著懂衩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪金踪。 梳的紋絲不亂的頭發(fā)上浊洞,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音胡岔,去河邊找鬼法希。 笑死,一個胖子當(dāng)著我的面吹牛姐军,可吹牛的內(nèi)容都是我干的铁材。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奕锌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了村生?” 一聲冷哼從身側(cè)響起惊暴,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趁桃,沒想到半個月后辽话,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肄鸽,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年油啤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了典徘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡益咬,死狀恐怖逮诲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幽告,我是刑警寧澤梅鹦,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站冗锁,受9級特大地震影響齐唆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冻河,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一箍邮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叨叙,春花似錦媒殉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至马昙,卻和暖如春桃犬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背行楞。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工攒暇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人子房。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓形用,卻偏偏與公主長得像,于是被迫代替她去往敵國和親证杭。 傳聞我的和親對象是個殘疾皇子田度,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容