一、ListView的基本概念

  在Android所有常用的原生控件当中,用法最复杂的应该就是ListView了,它专门用于处理那种内容元素很多,手机屏幕无法展示出所有内容的情况。ListView可以使用列表的形式来展示内容,超出屏幕部分的内容只需要通过手指滑动就可以移动到屏幕内了。即使在ListView中加载非常非常多的数据,比如达到成百上千条甚至更多,ListView都不会发生崩溃,而且随着我们手指滑动来浏览更多数据时,程序所占用的内存竟然都不会跟着增长。

二、示例代码

  定义一个实体类,作为ListView适配器的适配类型,代码如下所示:

package com.nyl.listviewtest;

public class SkinCare {
private String name;
private String efficacy; //功效
private int icon; //图标 public SkinCare(String name, String efficacy, int icon) {
this.name = name;
this.efficacy = efficacy;
this.icon = icon;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getEfficacy() {
return efficacy;
} public void setEfficacy(String efficacy) {
this.efficacy = efficacy;
} public int getIcon() {
return icon;
} public void setIcon(int icon) {
this.icon = icon;
}
}

  自定义一个ListView的子项布局,代码如下所示:

<?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="120dp"
android:orientation="horizontal"> <ImageView
android:id="@+id/ivSkinCare"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:orientation="vertical" > <TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="all"
android:textSize="15dp"/>
<TextView
android:id="@+id/tvEfficacy"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>

  创建一个自定义的适配器,这个适配器继承自ArrayAdapter,并将泛型指定为SkinCare这个实体类,新建SkinCareAdapter类,代码如下所示:

package com.nyl.listviewtest;

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; import java.util.List; /**
* Created by Administrator on 2017/3/9 0009.
*/ public class SkinCareAdapter extends ArrayAdapter<SkinCare> { private int resourceId; public SkinCareAdapter(Context context, int resource, List<SkinCare> objects) {
super(context, resource, objects);
resourceId = resource;
} /**
* 这个方法在每个子项被滚动到屏幕内的时候调用
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//通过getItem()方法得到当前SkinCare的实例
SkinCare skinCare = getItem(position); /**
* 提高ListView的运行效率,在快速滚动的时候也可以表现出更好的性能
*/ //使用ViewHolder来优化
ViewHolder viewHolder; //判断convertView 为空
if (convertView == null) {
//如果为空使用LayoutInflater去加载布局
convertView = LayoutInflater.from(getContext()).inflate(resourceId, null); viewHolder = new ViewHolder();
viewHolder.ivSkinCare = (ImageView) convertView.findViewById(R.id.ivSkinCare);
viewHolder.tvName = (TextView) convertView.findViewById(R.id.tvName);
viewHolder.tvEfficacy = (TextView) convertView.findViewById(R.id.tvEfficacy);
//将ViewHolder存储在View中
convertView.setTag(viewHolder);
} else {
//如果不为空直接对convertView进行重用
//重新获取ViewHolder
viewHolder = (ViewHolder) convertView.getTag();
} /* //使用LayoutInflater来加载传入的布局(这种写法运行效率是很低)
View view = LayoutInflater.from(getContext()).inflate(resourceId,null);
*//**
* 调用View的findViewById()方法来获取布局控件
*//*
ivSkinCare = (ImageView) view.findViewById(R.id.ivSkinCare);
tvName = (TextView) view.findViewById(R.id.tvName);
tvEfficacy = (TextView) view.findViewById(R.id.tvEfficacy); //调用setImageResource()方法来设置显示的图片
ivSkinCare.setImageResource(skinCare.getIcon());
//设置护肤品的名字
tvName.setText(skinCare.getName());
//设置护肤品的功效
tvEfficacy.setText(skinCare.getEfficacy());*/ viewHolder.ivSkinCare.setImageResource(skinCare.getIcon());
viewHolder.tvName.setText(skinCare.getName());
viewHolder.tvEfficacy.setText(skinCare.getEfficacy());
//将布局返回
return convertView;
}
static class ViewHolder {
ImageView ivSkinCare;
TextView tvEfficacy;//护肤品的功效
TextView tvName; //护肤品名
} }

  代码注释得很详细,不过多解释,接下编写MainActivity,代码如下所示:

package com.nyl.listviewtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast; import java.util.ArrayList;
import java.util.List; public class MainActivity extends Activity implements AdapterView.OnItemClickListener { private List<SkinCare> skinCare = new ArrayList<>();
private SkinCareAdapter skinCareAdapter;
private ListView lv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initSkinCare(); //初始化所有的护肤品数据
skinCareAdapter = new SkinCareAdapter(MainActivity.this,R.layout.skin_care,skinCare); //初始化布局控件
lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(skinCareAdapter); //设置setOnItemClickListener()方法来为ListView注册一个监听器
lv.setOnItemClickListener(this); } /**
* 当用户点击了ListView中任何一个子项时,就会回调onItemClick()方法,在这个方法中可以通过i参数判断出用户点击的哪一个
* 子项,然后获取到相应的护肤品,通过Toast将护肤品的名字显示出来。
*/
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
SkinCare sc = skinCare.get(i);
Toast.makeText(MainActivity.this,sc.getName(),Toast.LENGTH_SHORT).show();
} /**
* 构造函数中将护肤品的名字,功效和对应的图片id传入,然后把创建好的对象添加到护肤品列表中
*/
private void initSkinCare() {
SkinCare cleansingMilk = new SkinCare("洗面奶","基础清洁",R.mipmap.skin_care);
skinCare.add(cleansingMilk); SkinCare toner = new SkinCare("爽肤水","二次清洁,深层补水",R.mipmap.skin_care);
skinCare.add(toner); SkinCare essence = new SkinCare("精华液","集中解决肌肤某个问题,由内而外修复肌肤",R.mipmap.skin_care);
skinCare.add(essence); SkinCare eyeCream = new SkinCare("眼霜","舒缓眼部疲劳,改善眼部肤色",R.mipmap.skin_care);
skinCare.add(eyeCream); SkinCare latex = new SkinCare("乳液","给皮肤补充充足的营养,激活肌肤细胞,形成胶原蛋白",R.mipmap.skin_care);
skinCare.add(latex ); SkinCare faceCream = new SkinCare("面霜","不断给肌肤补充充足的水分和养分,使肌肤保持润泽状态",R.mipmap.skin_care);
skinCare.add(faceCream ); SkinCare mask = new SkinCare("面膜","清透毛孔,清楚表皮污垢,黑头,死细胞",R.mipmap.skin_care);
skinCare.add(mask ); SkinCare sunScreen = new SkinCare("隔离霜","全面隔离紫外线、灰尘、尼古丁、电脑辐射等有害物质对皮肤造成伤害",R.mipmap.skin_care);
skinCare.add(sunScreen ); /**
* 第二种写法
*/
/*LinkedList<SkinCare> data = new LinkedList<>();
data.add(new SkinCare("洗面奶","基础清洁",R.mipmap.skin_care));*/
} }

  运行程序,并点击一下精华液,效果如下:

  

  简单的ListView知识就学到这里,更多的知识点下节继续!

Android学习总结(十三) ———— ListView 简单用法的更多相关文章

  1. Android学习笔记:ListView简单应用--显示文字列表

    在activity中的编写如下代码: final List<String> items = new ArrayList<String>(); //设置要显示的数据,这里因为是例 ...

  2. Android学习——控件ListView的使用

    一.ListView的简单用法 首先新建一个ListViewTest项目,并让Android Studio自动创建好活动.然后修改activity_main.xml中的代码,如下: <?xml ...

  3. Android学习笔记之ListView复用机制

    PS:满打满算,差不多三个月没写博客了...前一阵忙的不可开交...总算是可以抽出时间研究研究其他事情了... 学习内容: 1.ListView的复用机制 2.ViewHolder的概念 1.List ...

  4. android学习笔记12——ListView、ListActivity

    ListView.ListActivity ==> ListView以垂直列表的形式显示所有列表项. 创建ListView的方式: 1.直接使用ListView创建 2.Activity继承Li ...

  5. [Android学习笔记]使用ListView

    简单使用ListView 关键在于Adatper Adatper用来连接UI与数据源.Adapter既负责提供数据,又负责创建Item视图. 一般步骤: 1.创建list_item.xml,用来创建L ...

  6. android学习8(ListView高级使用)

    ListView在android更开放的,于是继续ListView说明使用. 首先创建一个android项目,项目名为ListViewTest. ListView的简单使用 改动布局文件,改动后代码例 ...

  7. Android下拉刷新SwipeRefreshLayout简单用法

    之前一直都想用下拉刷新,感觉上是庞大的工程,所以搁置了.现在学习了一下其实真的超级简单. 看了<第一行代码>以及 https://www.jianshu.com/p/3c402a9e4b7 ...

  8. [android学习]android_gps定位服务简单实现

    前言 gps定位服务的学习是这段时间gps课程的学习内容,之前老师一直在将概念,今天终于是实践课(其实就是给了一个案例,让自己照着敲).不过在照着案列敲了两遍之后,发现老师的案例是在是太老了,并且直接 ...

  9. Android学习(十三) BroadcastReceiver组件(广播)

    一.Broadcast(广播) 是一种广泛应用在应用程序之间传输信息的机制. 二.Broadcast(广播接收器) 是对发送出来的广播进行过滤接收并响应的一类组件,它就是用来接收来自系统和应用中的广播 ...

随机推荐

  1. java一些jar包的bug(不定期更新)

    c3p0-0.9.5.jar 连接池jar包,常用于web项目,关闭连接池时,没有注销所有的driver 解决:可声明一个ServletContextListener的子类并设置监听,重写contex ...

  2. UVa 10213 How Many Pieces of Land ? (计算几何+大数)

    题意:一块圆形土地,在圆周上选n个点,然后两两连线,问把这块土地分成多少块? 析:这个题用的是欧拉公式,在平面图中,V-E+F=2,其中V是顶点数,E是边数,F是面数.对于这个题只要计算V和E就好. ...

  3. visual editor ve1.5下载

    eclipse官网的ve下载不了,下面这个能下 http://sourceforge.net/projects/visualeditor/files/latest/download

  4. MessageFomat学习

    MessageFomat 提供了一种以与语言无关的方式生成连接消息的方法. 用它来构造消息,显示给最终用户. 1.MessageFormat的格式 MessageFormatPattern:Forma ...

  5. 【WIP_S9】图论算法

    创建: 2018/06/01 图的概念 有向边 有向图 无向边 无向图 点的次数: 点连接的边的数量 闭路: 起点和重点一样 连接图: 任意两点之间都可到达 无闭路有向图: 没有闭路的有向图 森林: ...

  6. C++函数返回值与引用

    对于函数的返回值,看似简单,但并非如此,比如: int func(int a);该函数会返回一个int型,如果进行一个调用int result=func(3);会发生什么情况? 首先,func将返回值 ...

  7. bzoj 2406: 矩阵【二分+有源汇上下界可行流】

    最大值最小,所以考虑二分 |Σaij-Σbij|<=mid,所以Σbij的上下界就是(Σaij-mid,Σaij+mid) 考虑建有上下界网络,连接(s,i,Σaik-mid,Σaik+mid) ...

  8. Codevs 1282 约瑟夫问题

    1282 约瑟夫问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 有编号从1到N的N个小朋友在玩一种 ...

  9. 自定义的cell上面有图片时,如果产生了重用,图片可能会错乱问题

    当被重用的cell将要显示时,会调用这个方法,这个方法最大的用武之地是当你自定义的cell上面有图片时,如果产生了重用,图片可能会错乱(当图片来自异步下载时及其明显),这时我们可以重写这个方法把内容抹 ...

  10. [BZOJ2251/BJWC2010]外星联络

    Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息. ...