Android ListView实现图文列表显示
本文实例为大家分享了android listview实现图文列表显示的具体代码,供大家参考,具体内容如下
目标效果:
listview如果内容过多,可以滑动屏幕来显示,并且点击某一行可使用吐司方法弹出对应的水果名字。
1.新建项目,新建entity实体类包,包中建存储每行水果信息的fruit类。
fruit.java页面:
package com.example.entity; public class fruit { private int imageid; //使用id锁定水果图片 private string imagename; //对应的水果名字 public fruit(int imageid, string imagename) { super(); this.imageid = imageid; this.imagename = imagename; } public int getimageid() { return imageid; } public void setimageid(int imageid) { this.imageid = imageid; } public string getimagename() { return imagename; } public void setimagename(string imagename) { this.imagename = imagename; } }
2.在activity_main.xml页面添加listview控件,用于显示所有的水果即水果名称。
activity_main.xml页面:
<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"> <listview android:id="@+id/lvfruits" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparenttop="true" > </listview> </relativelayout>
3.一个listview中有多行信息,每行信息可以看成一个linearlayout子布局,子布局中有两个控件imageview和textview,按照水平排列。
listview_item.xml页面:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <imageview android:id="@+id/ivimage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <textview android:id="@+id/tvname" android:layout_marginleft="10dp" android:layout_gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="textview" /> </linearlayout>
4.新建adaptor包,包中建fruitadaopter.java类,添加适配器,连接布局和数据。
fruitadaopter.java页面:
package com.example.adapter; import java.util.list; import com.example.entity.fruit; import com.example.listview.r; import android.content.context; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.arrayadapter; import android.widget.imageview; import android.widget.textview; public class fruitadaoper extends arrayadapter<fruit> { // 适配器,泛型表示想要适配的数据类型 private int resourceid; public fruitadaoper(context context, int textviewresourceid, list<fruit> objects) { // 第一个参数是上下文环境,第二个参数是每一项的子布局,第三个参数是数据 super(context, textviewresourceid, objects); resourceid = textviewresourceid; //获取子布局 } @override //getview方法在每个子项被滚动到屏幕内的时候都会被调用,每次都将布局重新加载一边 public view getview(int position, view convertview, viewgroup parent) {//第一个参数表示位置,第二个参数表示缓存布局,第三个表示绑定的view对象 view view; viewholder viewholder; //实例viewholder,当程序第一次运行,保存获取到的控件,提高效率 if(convertview==null){ viewholder=new viewholder(); view = layoutinflater.from(getcontext()).inflate(//convertview为空代表布局没有被加载过,即getview方法没有被调用过,需要创建 resourceid, null); // 得到子布局,非固定的,和子布局id有关 viewholder.ivimage = (imageview) view.findviewbyid(r.id.ivimage);//获取控件,只需要调用一遍,调用过后保存在viewholder中 viewholder.tvname = (textview) view.findviewbyid(r.id.tvname); //获取控件 view.settag(viewholder); }else{ view=convertview; //convertview不为空代表布局被加载过,只需要将convertview的值取出即可 viewholder=(viewholder) view.gettag(); } fruit fruit = getitem(position);//实例指定位置的水果 viewholder.ivimage.setimageresource(fruit.getimageid());//获得指定位置水果的id viewholder.tvname.settext(fruit.getimagename()); //获得指定位置水果的名字 return view; } } class viewholder{ //当布局加载过后,保存获取到的控件信息。 imageview ivimage; textview tvname; }
5.在mainactivity.java页面初始化数据信息,并添加点击每一行的点击事件。
mainactivity.java页面:
package com.example.listview; import java.util.arraylist; import java.util.list; import com.example.adapter.fruitadaoper; import com.example.entity.fruit; import android.os.bundle; import android.app.activity; import android.view.menu; import android.view.view; import android.widget.adapterview; import android.widget.adapterview.onitemclicklistener; import android.widget.arrayadapter; import android.widget.listview; import android.widget.toast; public class mainactivity extends activity { private listview lvfruits; private list<fruit> fruitlist = new arraylist<fruit>(); //创建集合保存水果信息 @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); lvfruits = (listview) findviewbyid(r.id.lvfruits); //获得子布局 getdata(); fruitadaoper fruitadapter = new fruitadaoper(this, r.layout.listview_item, fruitlist); //关联数据和子布局 lvfruits.setadapter(fruitadapter); //绑定数据和适配器 lvfruits.setonitemclicklistener(new onitemclicklistener() { //点击每一行的点击事件 @override public void onitemclick(adapterview<?> adapterview, view view, int position, long id) { fruit fruit=fruitlist.get(position); //获取点击的那一行 toast.maketext(mainactivity.this,fruit.getimagename(),toast.length_long).show();//使用吐司输出点击那行水果的名字 } }); } private void getdata() { int[] imageids = { r.drawable.apple_pic, r.drawable.banana_pic, r.drawable.cherry_pic, r.drawable.grape_pic, r.drawable.mango_pic, r.drawable.orange_pic, r.drawable.pear_pic, r.drawable.pineapple_pic, r.drawable.strawberry_pic, r.drawable.watermelon_pic }; string[] names = { "苹果", "香蕉", "樱桃", "葡萄", "芒果", "橘子", "梨", "菠萝", "草莓", "西瓜" }; for(int i=0;i<imageids.length;i++){ //将数据添加到集合中 fruitlist.add(new fruit(imageids[i],names[i])); //将图片id和对应的name存储到一起 } } @override public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.main, menu); return true; } }
6.运行就可以出现目标效果了。
7.注意fruitadaopter.java类中的getview方法在每个子项被滚动到屏幕内的时候都会被调用,每次都将布局重新加载一边,所以为了提高效率可以进行判断,如果程序运行过一次就将布局保存在参数convertview中。
8.同样,getview中的获取控件id如果每次运行都要执行,会降低效率,所以也需要定义viewholder类存储获取的控件信息,当第一次运行时执行findviewbyid()后,将所有的控件信息保存到实例的viewholder中,后边每次进行调用即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。