chap3-列表与适配器_第1页
chap3-列表与适配器_第2页
chap3-列表与适配器_第3页
chap3-列表与适配器_第4页
chap3-列表与适配器_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

列表与适配器

3.1任务1-下拉列表Spinner21ArrayAdapter2Spinner的响应事件3程序调试技巧适配器ArrayAdapter将数组或者列表等批量的数据转换成相同格式的批量视图常用于Spinner、ListView、GridView等组件常用的构造方法publicArrayAdapter(Contextcontext,@LayoutResintresource,T[]objects)publicArrayAdapter(Contextcontext,@LayoutResintresource,List<T>objects)context是上下文,Activity对象,在MainActivity类里指MainActivity.thisresource是样式控制参数,常用android.R.layout.simple_list_item_1objects是数据,类型为数组T[]或者列表List<T>T是泛型,泛型扩大了方法接受的参数类型,并且取数不用强制类型转换UI组件设置适配器的方法setAdapter(),传参为Adapter对象3Spinner的特点和侦听回调Spinner常用于数据选择,具有展开和收缩两种视图形态当用户不选择数据时,Spinner处于收缩状态,显示的是被选中的数据当用户点击Spinner时,Spinner会展开视图,弹出下拉列表,将适配器中的所有数据展现,供用户选择Spinner的选中侦听回调4setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){@Override publicvoidonItemSelected(AdapterView<?>parent,Viewview, intposition,longid){//该回调方法在选项被选中时触发,Spinner初始化后默认选中第0项,也会触发此回调//parent是对应的组件对象,这里指Spinner对象//view是被点击触发的视图//position是被点击的位置索引,从0开始//id是被点击数据的id,在数据库Cursor中才会用到}@OverridepublicvoidonNothingSelected(AdapterView<?>parent){//没有选项被选中时触发,一般上用不到}});实现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(){

//设置选中侦听

@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);//设置适配器

}

}程序调试任务:验证行Spinner的onItemSelected()回调方法中传参parent和Spinner对象是同一个对象断点的使用Debug模式的使用单步模式和全速继续运行模式的配合使用变量窗口的使用运算表达式的使用6Spinner在onItemSelected()中取数方法探讨利用适配器的数据源对象(数组T[]或者列表List<T>),取得对应位置的数据可用ctrl+alt+v,快速生成返回变量利用适配器对象所提供的publicTgetItem(intposition)方法可用ctrl+alt+v利用使用了适配器的组件对象所提供的publicObjectgetItemAtPosition(intposition)方法需要强制类型转换利用回调方法中的传参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任务2-使用Spinner控制文本颜色81XML中定义数组2取XML资源数据3字符串数组与通用数组使用区别项目中的资源文件存放于res/values文件夹常用资源标签color标签定义颜色string标签定义字符串dimen标签定义尺寸drawable标签定义绘图资源及图片标签name属性给出资源的名称,以方便资源之间的引用@xxx/yyy,其中,xxx为数据类型,yyy为name值R.xxx.yyy,同理,xxx为数据类型,yyy为name值数组标签string-array定义字符串数组integer-array定义整型数组array定义通用数组item标签定义子节点,用于表示数组中1个元素的值可直接赋值也可以使用引用值9代码中使用XML数组引用方式R.array.yyy,其中yyy是数组的name属性值代码中使用数组利用Activity对象提供的getResources()方法获得Resources对象若是string-array数据,则可用getStringArray()方法若是integer-array,则用getIntArray()方法若是通用型array,则须通过obtainTypedArray()方法获得通用型数组,再进行二次解析getColor()解析颜色getDimension()解析尺寸getDrawable()解析绘图对象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>蓝色</item>

</string-array>

</resources>实现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中定义的资源数据需要Resources对象获取

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

//String[]类型的数组可直接调用getStringArray()方法获得

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

//资源没有提供颜色数组,只能用通过TypedArray获得数组对象

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个参数是获取失败时替换的默认颜色

//第2个参数使用了Color类里提供的颜色常量,Color.BLACK为黑色

tv.setTextColor(color);

}

@Override

publicvoidonNothingSelected(AdapterView<?>parent){

}

});

}

}3.3任务3-使用Spinner控制文本大小131文本字体大小控制2直接使用XML资源生成适配器3使用Logcat日志Logcat日志调用类android.util.Log日志打印可帮助开发者了解过程变量,在调试中经常使用提供的静态方法publicstaticintd(Stringtag,Stringmsg);//打印Debug日志信息publicstaticinte(Stringtag,Stringmsg);//打印Error错误信息,红色文字publicstaticinti(Stringtag,Stringmsg);//打印Info普通信息publicstaticintw(Stringtag,Stringmsg);//打印Warn警告信息,蓝色文字tag是标签,可以是任意文字,用于过滤信息或者通过标签告知用户,打印的是哪个信息msg是所需要打印的消息值,若是非String数据,可用字符串双引号+变量的方式,将后面的变量转为文本输出14项目实现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>小号</item>

<item>中号</item>

<item>大号</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);

//直接从资源文件取数得到适配器,注意第2参数和第3参数的参数顺序

//第2参数是资源数据引用,第3参数是样式,并且定义所用的泛型是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);

//尺寸数据是浮点数,第2个参数是默认值(取数解析失败时取默认值返回)

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任务4-使用ListView切换ImageView图片171ListView的使用2ImageView设置图片3ListView列表项点击事件图片资源drawable-v24文件夹Android7.0以下访问不了,会产生无图片资源异常drawable文件夹所有Android版本均可以访问2个文件夹共存Android7.0以上设备优先访问drawable-v24文件夹图片命名规则不能有中文、空格,以及大写英文字符等不符合资源命名方式的字符合法的是纯小写字母、短下画线“_”和阿拉伯数字,并且首字符必须是小写字母图片的引用XML中的引用方式为@drawable/xxxJava代码中的引用方式为R.drawable.xxxImageView的使用setImageResource()方法更换图片,参数为图片引用值XML中使用使用android:scaleType属性进行缩放比例设置18项目实现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”/>

<!--建议先复制图片资源到项目,通过向导设置资源文件-->

<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};

//图片资源引用本质上是int数据,用int[]数组管理若干张图片资源引用

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

android.R.layout.simple_list_item_1,cities);

lv.setAdapter(adapter);//ListView对象的使用方式:构造适配器,设置适配器

lv.setOnItemClickListener(newAdapterView.OnItemClickListener(){

//ListView对象的列表点击事件处理是setOnItemClickListener()方法

//Spinner对象的选中事件处理是setOnItemSelectedListener()方法

@Override

publicvoidonItemClick(AdapterView<?>parent,Viewview,

intposition,longid){

iv.setImageResource(images[position]);

//ImageView对象设置图片的方式有多种,根据数据类型选择对应方法

}

});

}

}注意事项Spinner侦听设置:setOnItemSelectedListener()ListView侦听设置:setOnItemClickListener()项目实现2-利用XML定义数据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中取数,因此可忽略泛型

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任务5-使用SimpleAdapter生成复杂视图211适配器使用自定义视图2HashMap的使用3SimpleAdapter的构造方法SimpleAdapter适配器可以实现自定义单元视图,将数据与自定义布局构成映射方法简单,易用,但是灵活性不够只能简单地进行数据与视图UI的映射,无法做逻辑处理需要使用HashMap进行数据封装,取数麻烦SimpleAdapter的构造方法publicSimpleAdapter(android.content.Contextcontext,java.util.List<?extendsjava.util.Map<String,?>>data,intresource,String[]from,int[]to)context是上下文data是复杂数据的表达,采用List类型数据,实际实现的时候可采用ArrayList(List的具体类)resource是自定义布局文件的引用,以R.layout.xxx的方式引用(xxx是res/layout/文件夹中xml布局文件名)数组from指定了data元素中哪些字段的数据取出渲染适配器行视图中数组to指向的UI,与数组to一一对应数组to指向resource布局文件中需要渲染数据的UI的id22SimpleAdapter中的数据参数data是List数据类型,并且该List的泛型是<?extendsjava.util.Map<String,?>>,表示List中的元素数据是Map的继承类(具体实现可用HashMap)“?extendsjava.util.Map”的问号表示某种类型,该类型通过extends继承自Map类型,而Map类型具有泛型<String,?>,表示该Map的key是String类型,value可以是任何数据类型传参data通过Map类型可封装任何数据,将多个不同种类的数据打包成一个元素,使之能对应适配器一行的视图编程建议HashMap中的key采用常量定义,减少误拼错误value若有不同的数据类型,则建议使用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">

<!--根节点为水平的LinearLayout,高度wrap_content,设置所有内容垂直居中-->

<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设置缩放为中线点裁剪-->

<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">

<!--内嵌一个垂直的LinearLayout,放置两个TextView,设置权重使之占据剩余空间-->

<!--内嵌的LinearLayout设置左边距,并设置垂直居中-->

<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的图标可在图片资源设置向导中输入call搜索-->

</LinearLayout>实现MainActivity26publicclassMainActivityextendsAppCompatActivity{

publicstaticfinalStringKEY_IMAGE="key_image";//Ctrl+D可复制当前行

publicstaticfinalStringKEY_NAME="key_name";

//若KEY_IMAGE被定义成privatestaticfinalString,则外部类不能访问

publicstaticfinalStringKEY_PHONE="key_phone";

//定义3个常量用于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接受的数据是列表数据,且元素是Map对象

//在HashMap中需要对数据封装,泛型约定key和value的数据类型

//由于value中有String和int数据,所以用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]);

//将图片、城市名称和电话号码通过key-value打包在同一个HashMap对象中

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

}

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

//from定义SimpleAdapter从HashMap的哪些字段取数据

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

R.id.row_view_tv_phone};

//HashMap从from所定义key中取值,填充到to对应的id的UI上

//from和to是一一对应的,from定义数据源字段,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对象中取数

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

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

Toast.makeText(getApplicationContext(),city,

Toast.LENGTH_SHORT).show();

//Toast显示点击列表项的城市名称

}

});

}

}3.6任务6-改写ArrayAdapter生成复杂视图271数据封装2适配器改写要点3XML布局转换为视图以及数据渲染方法实现自定义数据类City—City.java28publicclassCity{

privateStringname;

privateStringphone;

privateintpicId;

//Alt+Insert快捷键,选择Constructor→GetterandSetter选项

//由向导创建构造方法和取数存数方法

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;

}

}布局文件和图片资源同任务3-5改写ArrayAdapter通过构造方法传递必要的参数,使得适配器能得到所需操作的对象,例如上下文Context和数据源构造方法中的super指ArrayAdapter,需要3参数若使用默认的2参数构造方法,一定要改写getCount()方法,告知数据长度,否则生成不了视图(视图长度为0)改写getView()方法,在该方法中,通过LayoutInflater类将自定义布局生成View对象,并利用传参position取得数据源对应位置的单元数据将其渲染到行视图上。该方法须返回生成的View对象getView(intposition,ViewconvertView,ViewGroupparent)传参position为行视图的位置索引,与数据源的位置一一对应传参convertView是行视图对象,若此行视图需要重新生成,则为null,若行视图可重复利用则非空传参parent为适配器所依赖的组件,若该适配器用于ListView,则parent为ListView对象将XML布局生成视图对象的方法利用布局填充器LayoutInflater调用from()静态方法传入上下文参数,再调用inflate()方法将自定义布局生成视图赋给View对象v=LayoutInflater.from(context).inflate(R.layout.row_view,null,false);从视图对象中找出待渲染的UIv.findViewById(),适配器本身没有findViewById(),视图对象和Activity支持findViewById()29改写的适配器CityAdapter.java30publicclassCityAdapterextendsArrayAdapter<City>{

privateContextcontext;

privateList<City>list;

//上下文参数context(用于LayoutInflater),数据源list用于行视图数据渲染

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

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

//super就是父类ArrayAdapter,因此构造方法使用ArrayAdapter相同的方法

//android.R.layout.simple_list_item_1不会起作用,会被getView()重新处理

//若使用super(context,android.R.layout.simple_list_item_1)两个参数

//由于没有传数据,默认数据长度为0,不会生成视图,此时需要改写getCount()方法

this.context=context;

this.list=list;

}

@NonNull

@Override

publicViewgetView(intposition,@NullableViewconvertView,

@NonNullViewGroupparent){

//position行位置索引

//convertView为一行的视图,若不为空可对其利用,取出UI,直接数据渲染

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对象上的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)相当于phone==null||phone.equals("")

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

}else{

iv_call.setVisibility(View.VISIBLE);

//注释本行,并上下滑动ListView,行视图图片会超预期消失

}

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();

//对iv_call单独设置点击事件处理,与ListView的列表点击事件不冲突

}

});

returnv;

}

}实现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分别定义数据

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

list.add(newCity("杭州",

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论