欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android ListView实现图文列表显示

程序员文章站 2022-03-23 13:44:21
本文实例为大家分享了android listview实现图文列表显示的具体代码,供大家参考,具体内容如下 目标效果:   listview如果内容过多...

本文实例为大家分享了android listview实现图文列表显示的具体代码,供大家参考,具体内容如下

目标效果:

  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中,后边每次进行调用即可。

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