当前位置: 萬仟网 > IT编程>移动开发>Android > Android ListView实现图文列表显示

Android ListView实现图文列表显示

2019年07月29日 21:05  | 萬仟网IT编程  | 我要评论

本文实例为大家分享了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中,后边每次进行调用即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

◎已有 0 人评论

Copyright © 2019  萬仟网 保留所有权利. 粤ICP备17035492号-1
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com