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

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

(0)

相关推荐

  • Android三级缓存原理讲解

    三级缓存 内存缓存 本地缓存(SD卡缓存) 网络缓存 缓存顺序:首先从网络获取图片资源,然后将当前的图片缓存到本地,然后再缓存到内存中,那么下次访问图片资源就会优先从内存获取图片资源,如果内存中没有那么再去本地获取图片资源,如果本地还是没有,那么再从网络获取图片资源. 内存缓存 特点: 访问内存速度最快 不浪费流量 本地缓存 特点: 访问速度中等 不浪费流量 网络缓存 特点: 访问速度慢 浪费流量 网络缓存 网络缓存顾名思义就是从网络获取图片资源,然后来进行显示,那么我们可以通过AsyncTas

  • Android自定义动态壁纸开发(时钟)

    看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现. 先看效果 上图是动态壁纸钟的一个时钟. 我们先来看看 Livewallpaper(即动态墙纸)的实现,Android的动态墙纸并不是GIF图片,而是一个标准的Android应用程序,也就是APK.既然是应用程序,当然意味着天生具有GIF图片不具备的功能--能与用户发生交互,而且动态的背景变化绝不仅仅局限于GIF图片那般只能是固定的几张图片的循环播放.但是我们在这里没有加入与用户交互的动作,只是加入一个时钟(当然时

  • Android动态时钟壁纸开发

    本文实例为大家分享了Android动态时钟壁纸展示的具体代码,供大家参考,具体内容如下 先看效果 上图是动态壁纸钟的一个时钟. 我们先来看看 Livewallpaper(即动态墙纸)的实现,Android的动态墙纸并不是GIF图片,而是一个标准的Android应用程序,也就是APK.既然是应用程序,当然意味着天生具有GIF图片不具备的功能--能与用户发生交互,而且动态的背景变化绝不仅仅局限于GIF图片那般只能是固定的几张图片的循环播放.但是我们在这里没有加入与用户交互的动作,只是加入一个时钟(当

  • Android中的sqlite查询数据时去掉重复值的方法实例

    1.方式一: /** * 参数一:是否去重 * 参数二:表名 * 参数三:columns 表示查询的字段,new String[]{MODEL}表示查询该表当中的模式(也表示查询的结果) * 参数思:selection表示查询的条件,PHONE_NUMBER+" = ?" 表示根据手机号去查询模式 * 参数五:selectionArgs 表示查询条件对应的值,new String[]{phoneNumber}表示查询条件对应的值 * 参数六:String groupBy 分组 * 参数

  • Android SQLite数据库进行查询优化的方法

    前言 数据库的性能优化行业里面普遍偏少,今天这篇希望给大家带来点帮助 SQLite是个典型的嵌入式DBMS,它有很多优点,它是轻量级的,在编译之后很小,其中一个原因就是在查询优化方面比较简单 我们在使用SQLite进行数据存储查询的时候,要进行查询优化,这里就会用到索引,C端的数据量大部分情况下面虽然不是很大,但良好的索引建立习惯往往会带来不错的查询性能提升,同时在未知的将来经得住更大数据的考验,那如何优化数据库查询呢,下面我们用例子一一演示下. 先建个测试表table1,包含了三个索引: sq

  • Android自定义View实现圆环带数字百分比进度条

    分享一个自己制作的Android自定义View.是一个圆环形状的反映真实进度的进度条,百分比的进度文字跟随已完成进度的圆弧转动.以下是效果图: 这个自定义View可以根据需要设定圆环的宽度和百分比文字的大小. 先说一下思路:这个View一共分为三部分:第一部分也就是灰色的圆环部分,代表未完成的进度:第二部分是蓝色的圆弧部分,代表已经完成的进度:第三部分是红色的百分比的数字百分比文本,显示当前确切的完成进度. 下面是View的编写思路: ①:定义三个画笔,分别画灰色圆环,蓝色圆弧,红色文字: ②:

  • Android Studio 通过登录功能介绍SQLite数据库的使用流程

    前言: SQLite简介:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口,同样比起Mysql.PostgreSQL这两款开源的世

  • Android ListView列表视图的使用方法

    前言 当你要将某个从数据库或者文件中获得相当大的数据,在界面中向用户展示的时候,由于定义一个个视图比较麻烦,Android中提供了类似于数组的控件–ListView. 使用方法: 假设我们要转的数据是一个Person对象数组 package cn.zhuangzhihuang.mylist; public class Person { private String name; private String tel; public Person(String name, String tel) {

  • Android自定义动态壁纸开发详解

    看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现. 一.动态壁纸原理 如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单. 动态壁纸的本质其实就是一个服务在维护一个动态壁纸引擎Engine,所以我们看到的动态效果其实是通过这个引擎画出来的.而维护这个引擎的服务,就是WallpaperService.本篇文章并不讨论内部实现原理,只是让大家知道如何去实现动态壁纸,所以就不详细说了. 二.实现动态壁纸 大体上可分为三个步骤: 创建自定

  • Android自定义View实现水平带数字百分比进度条

    这个进度条可以反映真实进度,并且完成百分比的文字时随着进度增加而移动的,所在位置也恰好是真实完成的百分比位置,效果如下: 思路如下:第一部分是左侧的蓝色直线,代表已经完成的进度:第二部分是右侧灰色的直线,代表未完成的进度:第三部分是红色的百分比的数字百分比文本,显示当前确切的完成进度. 最关键的部分就是要确定百分比文本的确切位置,这里用了paint的getTextBounds方法,得到文本的宽高,然后再精确确定它的位置. view代码如下: public class NumberProgress

随机推荐