chap3-列表與適配器_第1頁(yè)
chap3-列表與適配器_第2頁(yè)
chap3-列表與適配器_第3頁(yè)
chap3-列表與適配器_第4頁(yè)
chap3-列表與適配器_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

列表與適配器

3.1任務(wù)1-下拉列表Spinner21ArrayAdapter2Spinner的響應(yīng)事件3程序調(diào)試技巧適配器ArrayAdapter將數(shù)組或者列表等批量的數(shù)據(jù)轉(zhuǎn)換成相同格式的批量視圖常用于Spinner、ListView、GridView等組件常用的構(gòu)造方法publicArrayAdapter(Contextcontext,@LayoutResintresource,T[]objects)publicArrayAdapter(Contextcontext,@LayoutResintresource,List<T>objects)context是上下文,Activity對(duì)象,在MainActivity類里指MainActivity.thisresource是樣式控制參數(shù),常用android.R.layout.simple_list_item_1objects是數(shù)據(jù),類型為數(shù)組T[]或者列表List<T>T是泛型,泛型擴(kuò)大了方法接受的參數(shù)類型,并且取數(shù)不用強(qiáng)制類型轉(zhuǎn)換UI組件設(shè)置適配器的方法setAdapter(),傳參為Adapter對(duì)象3Spinner的特點(diǎn)和偵聽回調(diào)Spinner常用于數(shù)據(jù)選擇,具有展開和收縮兩種視圖形態(tài)當(dāng)用戶不選擇數(shù)據(jù)時(shí),Spinner處于收縮狀態(tài),顯示的是被選中的數(shù)據(jù)當(dāng)用戶點(diǎn)擊Spinner時(shí),Spinner會(huì)展開視圖,彈出下拉列表,將適配器中的所有數(shù)據(jù)展現(xiàn),供用戶選擇Spinner的選中偵聽回調(diào)4setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){@Override publicvoidonItemSelected(AdapterView<?>parent,Viewview, intposition,longid){//該回調(diào)方法在選項(xiàng)被選中時(shí)觸發(fā),Spinner初始化后默認(rèn)選中第0項(xiàng),也會(huì)觸發(fā)此回調(diào)//parent是對(duì)應(yīng)的組件對(duì)象,這里指Spinner對(duì)象//view是被點(diǎn)擊觸發(fā)的視圖//position是被點(diǎn)擊的位置索引,從0開始//id是被點(diǎn)擊數(shù)據(jù)的id,在數(shù)據(jù)庫(kù)Cursor中才會(huì)用到}@OverridepublicvoidonNothingSelected(AdapterView<?>parent){//沒有選項(xiàng)被選中時(shí)觸發(fā),一般上用不到}});實(shí)現(xiàn)my_main.xml和MainActivity5<LinearLayoutxmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="YournameandID"/>

<TextView

android:id="@+id/tv_result"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text=""/>

<Spinner

android:id="@+id/spinner"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

</LinearLayout>publicclassMainActivityextendsAppCompatActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.my_main);

TextViewtv=findViewById(R.id.tv_result);

Spinnersp=findViewById(R.id.spinner);

String[]cities=newString[]{"杭州","寧波","溫州"};

ArrayAdapter<String>adapter=newArrayAdapter<>(this,

android.R.layout.simple_list_item_1,cities);

sp.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){

//設(shè)置選中偵聽

@Override

publicvoidonItemSelected(AdapterView<?>parent,Viewview,

intposition,longid){

//Stringcity=cities[position];//可用ctrl+alt+v

Stringcity=adapter.getItem(position);//可用ctrl+alt+v

//Stringcity=(String)parent.getItemAtPosition(position);

//Stringcity=(String)sp.getItemAtPosition(position);

//TextViewtemp=(TextView)view;

//Stringcity=(String)temp.getText();

tv.setText(city);

}

@Override

publicvoidonNothingSelected(AdapterView<?>parent){

}

});

sp.setAdapter(adapter);//設(shè)置適配器

}

}程序調(diào)試任務(wù):驗(yàn)證行Spinner的onItemSelected()回調(diào)方法中傳參parent和Spinner對(duì)象是同一個(gè)對(duì)象斷點(diǎn)的使用Debug模式的使用單步模式和全速繼續(xù)運(yùn)行模式的配合使用變量窗口的使用運(yùn)算表達(dá)式的使用6Spinner在onItemSelected()中取數(shù)方法探討利用適配器的數(shù)據(jù)源對(duì)象(數(shù)組T[]或者列表List<T>),取得對(duì)應(yīng)位置的數(shù)據(jù)可用ctrl+alt+v,快速生成返回變量利用適配器對(duì)象所提供的publicTgetItem(intposition)方法可用ctrl+alt+v利用使用了適配器的組件對(duì)象所提供的publicObjectgetItemAtPosition(intposition)方法需要強(qiáng)制類型轉(zhuǎn)換利用回調(diào)方法中的傳參view使用不方便7

publicvoidonItemSelected(AdapterView<?>parent,Viewview,

intposition,longid){

//Stringcity=cities[position];//可用ctrl+alt+v

Stringcity=adapter.getItem(position);//可用ctrl+alt+v

//Stringcity=(String)parent.getItemAtPosition(position);

//Stringcity=(String)sp.getItemAtPosition(position);

//TextViewtemp=(TextView)view;

//Stringcity=(String)temp.getText();}3.2任務(wù)2-使用Spinner控制文本顏色81XML中定義數(shù)組2取XML資源數(shù)據(jù)3字符串?dāng)?shù)組與通用數(shù)組使用區(qū)別項(xiàng)目中的資源文件存放于res/values文件夾常用資源標(biāo)簽color標(biāo)簽定義顏色string標(biāo)簽定義字符串dimen標(biāo)簽定義尺寸drawable標(biāo)簽定義繪圖資源及圖片標(biāo)簽name屬性給出資源的名稱,以方便資源之間的引用@xxx/yyy,其中,xxx為數(shù)據(jù)類型,yyy為name值R.xxx.yyy,同理,xxx為數(shù)據(jù)類型,yyy為name值數(shù)組標(biāo)簽string-array定義字符串?dāng)?shù)組integer-array定義整型數(shù)組array定義通用數(shù)組item標(biāo)簽定義子節(jié)點(diǎn),用于表示數(shù)組中1個(gè)元素的值可直接賦值也可以使用引用值9代碼中使用XML數(shù)組引用方式R.array.yyy,其中yyy是數(shù)組的name屬性值代碼中使用數(shù)組利用Activity對(duì)象提供的getResources()方法獲得Resources對(duì)象若是string-array數(shù)據(jù),則可用getStringArray()方法若是integer-array,則用getIntArray()方法若是通用型array,則須通過obtainTypedArray()方法獲得通用型數(shù)組,再進(jìn)行二次解析getColor()解析顏色getDimension()解析尺寸getDrawable()解析繪圖對(duì)象10res/values/colors.xml11<resources>

<colorname="purple_200">#FFBB86FC</color>

<colorname="purple_500">#FF6200EE</color>

<colorname="purple_700">#FF3700B3</color>

<colorname="teal_200">#FF03DAC5</color>

<colorname="teal_700">#FF018786</color>

<colorname="black">#FF000000</color>

<colorname="white">#FFFFFFFF</color>

<colorname="ddd">@color/black</color>

<arrayname="my_color_values">

<item>#f00</item>

<item>#0f0</item>

<item>#00f</item>

</array>

<string-arrayname="my_color_names">

<item>紅色</item>

<item>綠色</item>

<item>藍(lán)色</item>

</string-array>

</resources>實(shí)現(xiàn)my_main.xml和MainActivity12<LinearLayoutxmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

<TextView

android:id="@+id/tv"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="YournameandID"/>

<Spinner

android:id="@+id/spinner"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

</LinearLayout>publicclassMainActivityextendsAppCompatActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.my_main);

TextViewtv=findViewById(R.id.tv);

Spinnersp=findViewById(R.id.spinner);

Resourcesres=getResources();//XML中定義的資源數(shù)據(jù)需要Resources對(duì)象獲取

String[]colorNames=res.getStringArray(R.array.my_color_names);

//String[]類型的數(shù)組可直接調(diào)用getStringArray()方法獲得

TypedArraycolorValues=res.obtainTypedArray(R.array.my_color_values);

//資源沒有提供顏色數(shù)組,只能用通過TypedArray獲得數(shù)組對(duì)象

ArrayAdapter<String>adapter=newArrayAdapter<>(this,

android.R.layout.simple_list_item_1,colorNames);

sp.setAdapter(adapter);

sp.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){

@Override

publicvoidonItemSelected(AdapterView<?>parent,Viewview,

intposition,longid){

intcolor=colorValues.getColor(position,Color.BLACK);

//第2個(gè)參數(shù)是獲取失敗時(shí)替換的默認(rèn)顏色

//第2個(gè)參數(shù)使用了Color類里提供的顏色常量,Color.BLACK為黑色

tv.setTextColor(color);

}

@Override

publicvoidonNothingSelected(AdapterView<?>parent){

}

});

}

}3.3任務(wù)3-使用Spinner控制文本大小131文本字體大小控制2直接使用XML資源生成適配器3使用Logcat日志Logcat日志調(diào)用類android.util.Log日志打印可幫助開發(fā)者了解過程變量,在調(diào)試中經(jīng)常使用提供的靜態(tài)方法publicstaticintd(Stringtag,Stringmsg);//打印Debug日志信息publicstaticinte(Stringtag,Stringmsg);//打印Error錯(cuò)誤信息,紅色文字publicstaticinti(Stringtag,Stringmsg);//打印Info普通信息publicstaticintw(Stringtag,Stringmsg);//打印Warn警告信息,藍(lán)色文字tag是標(biāo)簽,可以是任意文字,用于過濾信息或者通過標(biāo)簽告知用戶,打印的是哪個(gè)信息msg是所需要打印的消息值,若是非String數(shù)據(jù),可用字符串雙引號(hào)+變量的方式,將后面的變量轉(zhuǎn)為文本輸出14項(xiàng)目實(shí)現(xiàn)15<!--res/values/dimens.xml-->

<resources>

<arrayname="my_dimen_values">

<item>10sp</item>

<item>16sp</item>

<item>24sp</item>

</array>

<string-arrayname="my_dimen_names">

<item>小號(hào)</item>

<item>中號(hào)</item>

<item>大號(hào)</item>

</string-array>

</resources><!--my_main.xml-->

<LinearLayoutxmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

<TextView

android:id="@+id/tv"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="YournameandID"/>

<Spinner

android:id="@+id/spinner"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

</LinearLayout>//MainActivity.java

publicclassMainActivityextendsAppCompatActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.my_main);

Spinnersp=findViewById(R.id.spinner);

TextViewtv=findViewById(R.id.tv);

ArrayAdapter<CharSequence>adapter=ArrayAdapter.createFromResource(this,

R.array.my_dimen_names,android.R.layout.simple_list_item_1);

//直接從資源文件取數(shù)得到適配器,注意第2參數(shù)和第3參數(shù)的參數(shù)順序

//第2參數(shù)是資源數(shù)據(jù)引用,第3參數(shù)是樣式,并且定義所用的泛型是CharSequence

Resourcesres=getResources();

TypedArraydimenValues=res.obtainTypedArray(R.array.my_dimen_values);

sp.setAdapter(adapter);

sp.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){

@Override

publicvoidonItemSelected(AdapterView<?>parent,Viewview,

intposition,longid){

floatdimension=dimenValues.getDimension(position,10.0f);

//尺寸數(shù)據(jù)是浮點(diǎn)數(shù),第2個(gè)參數(shù)是默認(rèn)值(取數(shù)解析失敗時(shí)取默認(rèn)值返回)

Log.d("Dimension",""+dimension);

//Log.d可打印Debug日志,在Logcat窗口中可查看

Log.e("Dimension",""+dimension);//打印Error信息

Log.i("Dimension",""+dimension);//打印Info信息

Log.w("Dimension",""+dimension);//打印Warn信息

tv.setTextSize(dimension);

}

@Override

publicvoidonNothingSelected(AdapterView<?>parent){

}

});

}

}查看日志163.4任務(wù)4-使用ListView切換ImageView圖片171ListView的使用2ImageView設(shè)置圖片3ListView列表項(xiàng)點(diǎn)擊事件圖片資源drawable-v24文件夾Android7.0以下訪問不了,會(huì)產(chǎn)生無(wú)圖片資源異常drawable文件夾所有Android版本均可以訪問2個(gè)文件夾共存Android7.0以上設(shè)備優(yōu)先訪問drawable-v24文件夾圖片命名規(guī)則不能有中文、空格,以及大寫英文字符等不符合資源命名方式的字符合法的是純小寫字母、短下畫線“_”和阿拉伯?dāng)?shù)字,并且首字符必須是小寫字母圖片的引用XML中的引用方式為@drawable/xxxJava代碼中的引用方式為R.drawable.xxxImageView的使用setImageResource()方法更換圖片,參數(shù)為圖片引用值XML中使用使用android:scaleType屬性進(jìn)行縮放比例設(shè)置18項(xiàng)目實(shí)現(xiàn)19<!--my_main.xml-->

<LinearLayoutxmlns:android=“/apk/res/android”

xmlns:app=“/apk/res-auto”

android:orientation=“vertical”

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“YournameandID”/>

<ImageView

android:id=“@+id/imageView”

android:layout_width=“200dp”

android:layout_height=“200dp”

android:layout_gravity=“center”

app:srcCompat=“@drawable/hangzhou”/>

<!--建議先復(fù)制圖片資源到項(xiàng)目,通過向?qū)гO(shè)置資源文件-->

<ListView

android:id="@+id/listview"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

</LinearLayout>publicclassMainActivityextendsAppCompatActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.my_main);

ImageViewiv=findViewById(R.id.imageView);

ListViewlv=findViewById(R.id.listview);

String[]cities=newString[]{"杭州","寧波","溫州"};

int[]images=newint[]{R.drawable.hangzhou,R.drawable.ningbo,

R.drawable.wenzhou};

//圖片資源引用本質(zhì)上是int數(shù)據(jù),用int[]數(shù)組管理若干張圖片資源引用

ArrayAdapter<String>adapter=newArrayAdapter<>(this,

android.R.layout.simple_list_item_1,cities);

lv.setAdapter(adapter);//ListView對(duì)象的使用方式:構(gòu)造適配器,設(shè)置適配器

lv.setOnItemClickListener(newAdapterView.OnItemClickListener(){

//ListView對(duì)象的列表點(diǎn)擊事件處理是setOnItemClickListener()方法

//Spinner對(duì)象的選中事件處理是setOnItemSelectedListener()方法

@Override

publicvoidonItemClick(AdapterView<?>parent,Viewview,

intposition,longid){

iv.setImageResource(images[position]);

//ImageView對(duì)象設(shè)置圖片的方式有多種,根據(jù)數(shù)據(jù)類型選擇對(duì)應(yīng)方法

}

});

}

}注意事項(xiàng)Spinner偵聽設(shè)置:setOnItemSelectedListener()ListView偵聽設(shè)置:setOnItemClickListener()項(xiàng)目實(shí)現(xiàn)2-利用XML定義數(shù)據(jù)20<!--res/values/images.xml-->

<resources>

<integer-arrayname="image_values">

<item>@drawable/hangzhou</item>

<item>@drawable/ningbo</item>

<item>@drawable/wenzhou</item>

</integer-array>

<string-arrayname="image_names">

<item>杭州</item>

<item>寧波</item>

<item>溫州</item>

</string-array>

</resources>publicclassMainActivityextendsAppCompatActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.my_main);

ImageViewiv=findViewById(R.id.imageView);

ListViewlv=findViewById(R.id.listview);

ArrayAdapteradapter=ArrayAdapter.createFromResource(this,

R.array.image_names,android.R.layout.simple_list_item_1);

//不用從adapter中取數(shù),因此可忽略泛型

lv.setAdapter(adapter);

TypedArrayimages=getResources().obtainTypedArray(R.array.image_values);

lv.setOnItemClickListener(newAdapterView.OnItemClickListener(){

@Override

publicvoidonItemClick(AdapterView<?>parent,Viewview,

intposition,longid){

Drawabledrawable=images.getDrawable(position);

iv.setImageDrawable(drawable);

}

});

}

}3.5任務(wù)5-使用SimpleAdapter生成復(fù)雜視圖211適配器使用自定義視圖2HashMap的使用3SimpleAdapter的構(gòu)造方法SimpleAdapter適配器可以實(shí)現(xiàn)自定義單元視圖,將數(shù)據(jù)與自定義布局構(gòu)成映射方法簡(jiǎn)單,易用,但是靈活性不夠只能簡(jiǎn)單地進(jìn)行數(shù)據(jù)與視圖UI的映射,無(wú)法做邏輯處理需要使用HashMap進(jìn)行數(shù)據(jù)封裝,取數(shù)麻煩SimpleAdapter的構(gòu)造方法publicSimpleAdapter(android.content.Contextcontext,java.util.List<?extendsjava.util.Map<String,?>>data,intresource,String[]from,int[]to)context是上下文data是復(fù)雜數(shù)據(jù)的表達(dá),采用List類型數(shù)據(jù),實(shí)際實(shí)現(xiàn)的時(shí)候可采用ArrayList(List的具體類)resource是自定義布局文件的引用,以R.layout.xxx的方式引用(xxx是res/layout/文件夾中xml布局文件名)數(shù)組from指定了data元素中哪些字段的數(shù)據(jù)取出渲染適配器行視圖中數(shù)組to指向的UI,與數(shù)組to一一對(duì)應(yīng)數(shù)組to指向resource布局文件中需要渲染數(shù)據(jù)的UI的id22SimpleAdapter中的數(shù)據(jù)參數(shù)data是List數(shù)據(jù)類型,并且該List的泛型是<?extendsjava.util.Map<String,?>>,表示List中的元素?cái)?shù)據(jù)是Map的繼承類(具體實(shí)現(xiàn)可用HashMap)“?extendsjava.util.Map”的問號(hào)表示某種類型,該類型通過extends繼承自Map類型,而Map類型具有泛型<String,?>,表示該Map的key是String類型,value可以是任何數(shù)據(jù)類型傳參data通過Map類型可封裝任何數(shù)據(jù),將多個(gè)不同種類的數(shù)據(jù)打包成一個(gè)元素,使之能對(duì)應(yīng)適配器一行的視圖編程建議HashMap中的key采用常量定義,減少誤拼錯(cuò)誤value若有不同的數(shù)據(jù)類型,則建議使用Object類型23布局文件my_main.xml和圖片資源24<LinearLayoutxmlns:android="/apk/res/android"

xmlns:app="/apk/res-auto"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="YournameandID"/>

<ListView

android:id="@+id/listview"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

</LinearLayout>適配器自定義視圖row_view.xml25<LinearLayoutxmlns:android="/apk/res/android"

xmlns:app="/apk/res-auto"

android:layout_width="match_parent"

android:gravity="center_vertical"

android:layout_height="wrap_content">

<!--根節(jié)點(diǎn)為水平的LinearLayout,高度wrap_content,設(shè)置所有內(nèi)容垂直居中-->

<ImageView

android:id="@+id/row_view_iv"

android:layout_width="80dp"

android:layout_height="80dp"

android:scaleType="centerCrop"

app:srcCompat="@drawable/hangzhou"/>

<!--所有的id以row_view作為前綴,便于查找-->

<!--ImageView設(shè)置縮放為中線點(diǎn)裁剪-->

<LinearLayout

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:paddingLeft="10dp"

android:layout_weight="1"

android:gravity="center_vertical"

android:orientation="vertical">

<!--內(nèi)嵌一個(gè)垂直的LinearLayout,放置兩個(gè)TextView,設(shè)置權(quán)重使之占據(jù)剩余空間-->

<!--內(nèi)嵌的LinearLayout設(shè)置左邊距,并設(shè)置垂直居中-->

<TextView

android:id="@+id/row_view_tv_name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:textSize="20sp"

android:textColor="#000"

android:text="Name"/>

<TextView

android:id="@+id/row_view_tv_phone"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="Phone"/>

</LinearLayout>

<ImageView

android:id="@+id/row_view_iv_call"

android:layout_width="40dp"

android:layout_height="40dp"

app:srcCompat="@android:drawable/sym_action_call"/>

<!--row_view_iv_call的圖標(biāo)可在圖片資源設(shè)置向?qū)е休斎隿all搜索-->

</LinearLayout>實(shí)現(xiàn)MainActivity26publicclassMainActivityextendsAppCompatActivity{

publicstaticfinalStringKEY_IMAGE="key_image";//Ctrl+D可復(fù)制當(dāng)前行

publicstaticfinalStringKEY_NAME="key_name";

//若KEY_IMAGE被定義成privatestaticfinalString,則外部類不能訪問

publicstaticfinalStringKEY_PHONE="key_phone";

//定義3個(gè)常量用于HashMap的key

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.my_main);

int[]images=newint[]{R.drawable.hangzhou,R.drawable.ningbo,

R.drawable.wenzhou};

String[]cities=newString[]{"杭州","寧波","溫州"};

String[]phones=newString[]{"0571-12345","0574-12345","0577-12345"};

ListViewlv=findViewById(R.id.listview);

ArrayList<HashMap<String,Object>>list=newArrayList<>();

//SimpleAdapter接受的數(shù)據(jù)是列表數(shù)據(jù),且元素是Map對(duì)象

//在HashMap中需要對(duì)數(shù)據(jù)封裝,泛型約定key和value的數(shù)據(jù)類型

//由于value中有String和int數(shù)據(jù),所以用Object定義value類型

//key一般用String類型,用字符串常量,常量定義用純大寫

for(inti=0;i<images.length;i++){

HashMap<String,Object>hashMap=newHashMap<>();

hashMap.put(KEY_IMAGE,images[i]);

hashMap.put(KEY_NAME,cities[i]);

hashMap.put(KEY_PHONE,phones[i]);

//將圖片、城市名稱和電話號(hào)碼通過key-value打包在同一個(gè)HashMap對(duì)象中

list.add(hashMap);//將hashmap添加到list末尾

}

String[]from=newString[]{KEY_IMAGE,KEY_NAME,KEY_PHONE};

//from定義SimpleAdapter從HashMap的哪些字段取數(shù)據(jù)

int[]to=newint[]{R.id.row_view_iv,R.id.row_view_tv_name,

R.id.row_view_tv_phone};

//HashMap從from所定義key中取值,填充到to對(duì)應(yīng)的id的UI上

//from和to是一一對(duì)應(yīng)的,from定義數(shù)據(jù)源字段,to定義渲染的UI的id

SimpleAdapteradapter=newSimpleAdapter(this,list,R.layout.row_view,

from,to);

lv.setAdapter(adapter);

lv.setOnItemClickListener(newAdapterView.OnItemClickListener(){

@Override

publicvoidonItemClick(AdapterView<?>parent,Viewview,

intposition,longid){

HashMap<String,Object>hashMap=list.get(position);

//從list對(duì)象中取數(shù)

Stringcity=(String)hashMap.get(KEY_NAME);

//get()方法返回的是Object

Toast.makeText(getApplicationContext(),city,

Toast.LENGTH_SHORT).show();

//Toast顯示點(diǎn)擊列表項(xiàng)的城市名稱

}

});

}

}3.6任務(wù)6-改寫ArrayAdapter生成復(fù)雜視圖271數(shù)據(jù)封裝2適配器改寫要點(diǎn)3XML布局轉(zhuǎn)換為視圖以及數(shù)據(jù)渲染方法實(shí)現(xiàn)自定義數(shù)據(jù)類City—City.java28publicclassCity{

privateStringname;

privateStringphone;

privateintpicId;

//Alt+Insert快捷鍵,選擇Constructor→GetterandSetter選項(xiàng)

//由向?qū)?chuàng)建構(gòu)造方法和取數(shù)存數(shù)方法

publicCity(Stringname,Stringphone,intpicId){

this.name=name;

this.phone=phone;

this.picId=picId;

}

publicintgetPicId(){

returnpicId;

}

publicvoidsetPicId(intpicId){

this.picId=picId;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicStringgetPhone(){

returnphone;

}

publicvoidsetPhone(Stringphone){

this.phone=phone;

}

}布局文件和圖片資源同任務(wù)3-5改寫ArrayAdapter通過構(gòu)造方法傳遞必要的參數(shù),使得適配器能得到所需操作的對(duì)象,例如上下文Context和數(shù)據(jù)源構(gòu)造方法中的super指ArrayAdapter,需要3參數(shù)若使用默認(rèn)的2參數(shù)構(gòu)造方法,一定要改寫getCount()方法,告知數(shù)據(jù)長(zhǎng)度,否則生成不了視圖(視圖長(zhǎng)度為0)改寫getView()方法,在該方法中,通過LayoutInflater類將自定義布局生成View對(duì)象,并利用傳參position取得數(shù)據(jù)源對(duì)應(yīng)位置的單元數(shù)據(jù)將其渲染到行視圖上。該方法須返回生成的View對(duì)象getView(intposition,ViewconvertView,ViewGroupparent)傳參position為行視圖的位置索引,與數(shù)據(jù)源的位置一一對(duì)應(yīng)傳參convertView是行視圖對(duì)象,若此行視圖需要重新生成,則為null,若行視圖可重復(fù)利用則非空傳參parent為適配器所依賴的組件,若該適配器用于ListView,則parent為L(zhǎng)istView對(duì)象將XML布局生成視圖對(duì)象的方法利用布局填充器LayoutInflater調(diào)用from()靜態(tài)方法傳入上下文參數(shù),再調(diào)用inflate()方法將自定義布局生成視圖賦給View對(duì)象v=LayoutInflater.from(context).inflate(R.layout.row_view,null,false);從視圖對(duì)象中找出待渲染的UIv.findViewById(),適配器本身沒有findViewById(),視圖對(duì)象和Activity支持findViewById()29改寫的適配器CityAdapter.java30publicclassCityAdapterextendsArrayAdapter<City>{

privateContextcontext;

privateList<City>list;

//上下文參數(shù)context(用于LayoutInflater),數(shù)據(jù)源list用于行視圖數(shù)據(jù)渲染

publicCityAdapter(@NonNullContextcontext,List<City>list){

super(context,android.R.layout.simple_list_item_1,list);

//super就是父類ArrayAdapter,因此構(gòu)造方法使用ArrayAdapter相同的方法

//android.R.layout.simple_list_item_1不會(huì)起作用,會(huì)被getView()重新處理

//若使用super(context,android.R.layout.simple_list_item_1)兩個(gè)參數(shù)

//由于沒有傳數(shù)據(jù),默認(rèn)數(shù)據(jù)長(zhǎng)度為0,不會(huì)生成視圖,此時(shí)需要改寫getCount()方法

this.context=context;

this.list=list;

}

@NonNull

@Override

publicViewgetView(intposition,@NullableViewconvertView,

@NonNullViewGroupparent){

//position行位置索引

//convertView為一行的視圖,若不為空可對(duì)其利用,取出UI,直接數(shù)據(jù)渲染

Viewv=convertView;

if(v==null){

v=LayoutInflater.from(context).inflate(R.layout.row_view,

null,false);

//inflate()固定用法,false不綁定到根視圖上,根視圖root=null

}

ImageViewiv=v.findViewById(R.id.row_view_iv);

//注意是v對(duì)象上的findViewById()方法

TextViewtv_name=v.findViewById(R.id.row_view_tv_name);

TextViewtv_phone=v.findViewById(R.id.row_view_tv_phone);

ImageViewiv_call=v.findViewById(R.id.row_view_iv_call);

Citycity=list.get(position);

iv.setImageResource(city.getPicId());

Stringphone=city.getPhone();

if(TextUtils.isEmpty(phone)){

//TextUtils.isEmpty(phone)相當(dāng)于phone==null||phone.equals("")

iv_call.setVisibility(View.GONE);//讓iv_call消失

}else{

iv_call.setVisibility(View.VISIBLE);

//注釋本行,并上下滑動(dòng)ListView,行視圖圖片會(huì)超預(yù)期消失

}

tv_name.setText(city.getName());

tv_phone.setText(phone);

iv_call.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

Toast.makeText(context,"Calling"+phone,

Toast.LENGTH_SHORT).show();

//對(duì)iv_call單獨(dú)設(shè)置點(diǎn)擊事件處理,與ListView的列表點(diǎn)擊事件不沖突

}

});

returnv;

}

}實(shí)現(xiàn)MainActivity31publicclassMainActivityextendsAppCompatActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.my_main);

ListViewlv=findViewById(R.id.listview);

ArrayList<City>list=newArrayList<>();

list.add(newCity("溫州","",R.drawable.wenzhou));

//電話用""或null分別定義數(shù)據(jù)

for(inti=0;i<3;i++){

list.add(newCity("杭州",

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論