在使用ListView的时候,需要加载适配器和数据源,这篇文章主要介绍一下ListView的使用以及利用ListView的缓存机制来减少系统的初始化时间。

ListView的使用


ListView和ViewPager很类似,首先在ArrayList中存放数据源,并把它作为Adapter的构造函数的参数传入Adapter类中,之后在Adapter中实现相应方法,具体代码如下:

1.在ArrayList中存放数据源

由于ListView中,每一个View是一个Item,所以数据源中需要存放Item当中每一个View的信息,因此,可以定义一个自定义类来存放这些需要存放的信息。代码如下:

XML中,声明Item,包括一个ImageView和一个TextView

<?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:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/add"
android:id="@+id/goods_iv"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/goods_tv"/> </LinearLayout>

自定义Goods类来存放需要修改的信息:

public class Goods
{
public String text;
public int ImageId;
}

在Activity中声明ArrayList,并生成数据源:

ArrayList<Goods> goods=new ArrayList<>();
for(int i=1;i<=20;i++)
{
Goods good=new Goods();
good.ImageId=R.drawable.good;
good.text="商品"+i;
goods.add(good);
}

2.构造适配器

ListView的适配器为BaseAdapter,其中getCount(),getItem()和getItemID()三个方法与PageAdapter类似,最有讲究的便是getView方法,这里着重讲解一下getView的写法:

getView方法,主要是获取position位置的View对象。我们可以每次都声明一个新的View,并通过findViewById获取Item中的每个控件,但这样会用到大量的耗时操作,并重复占用资源。因此,我们可以利用ListView的缓存机制,来获取这些View对象。

首先,在BaseAdapter中,声明一个内部类,用来存放已经缓存好的每一个组件:

class ViewHolder
{
public ImageView iv;
public TextView tv;
}

然后,对应getView每一个需要加载的View来说,判断他是否已经被加载过,如果没有,便进行加载,并利用View的setTag方法,把已经加载的View和组件相关联:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
if(convertView==null)
{
convertView=inflater.inflate(R.layout.item_goods,null);
viewHolder=new ViewHolder();
viewHolder.iv= (ImageView) convertView.findViewById(R.id.goods_iv);
viewHolder.tv= (TextView) convertView.findViewById(R.id.goods_tv);
convertView.setTag(viewHolder);
}

若已经加载过,则直接取出,进行组件的修改即可:

else
{
viewHolder= (ViewHolder) convertView.getTag();
}
Goods good=goodslist.get(position);
viewHolder.iv.setImageResource(good.ImageId);
viewHolder.tv.setText(good.text);
return convertView

3.ListView与适配器向关联

与ViewPager类似,这里只给出代码,不再赘述

GoodsAdapter adapter=new GoodsAdapter(goods,getContext());
listview.setAdapter(adapter);

Android学习——ListView的缓存机制的更多相关文章

  1. Android笔记(二十五) ListView的缓存机制与BaseAdapter

    之前接触了ListView和Adapter,Adapter将数据源和View连接起来,实际应用中,我们要显示的数据往往有很多,而屏幕只有那么大,系统只能屏幕所能显示的内容,当我们滑动屏幕,会将旧的内容 ...

  2. 探究ListView 的缓存机制

    概述 ListView 是继承AbListView,AbListView是所有列表类控件的基类. ListView的数据加载 在ListView数据加载中最关键的一个函数就是makeAndAddVie ...

  3. 九、Android学习第八天——广播机制与WIFI网络操作(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...

  4. android 视频的缩略图 缓存机制和 异步加载缩略图

    在这次的工作开发项目中,涉及到一个视频缩略图的视频列表:这个在大家看来,制作视频缩略图就是两行代码就搞定的事.确实是这样的,百度一下,每个帖子都知道制作视频缩略图的方法,在这里确实也是一样的,但是我要 ...

  5. 学习ASP.NET缓存机制

    缓存是大型BS架构网站的性能优化通用手段,之前知道有这个概念,并且也知道很重要,但是一直没静下心来了解.这次借着学习PetShop源码的机会熟悉一下ASP.NET基本的缓存机制(生产环境中的真实缓存有 ...

  6. Android学习---ListView和Inflater的使用,将一个布局文件转化为一个对象

    本文将介绍ListView和Inflater的使用,将接上一篇文章内容. 一.什么是ListView? 在android开发中ListView是比较常用的控件,ListView 控件可使用四种不同视图 ...

  7. Android学习--ListView

    这篇文章用于总结自己这两天学到的安卓的ListView和RecyclerView 的笔记,以及从我这个iOS开发者的角度去理解和学习这两个控件,会比较一下他们个iOS中那些控件是一致的,可以用来对比的 ...

  8. android 学习 ListView使用补充

    前面两篇学习适配器的时候用的就是listview,主要是简单的添加,今晚在看了下listview滚动状态事件和动态加载数据,一个小demo. listview的滚动状态主要有三种,onScrollSt ...

  9. Android学习---ListView的点击事件,simpleAdapter和arrayadapter,SimpleCursoAdapter的原理和使用

    如题,本文将介绍 listview的点击事件,simpleAdapter和arrayadapter的原理和使用. 1.ListView的注册点击事件 //注册点击事件 personListView.s ...

随机推荐

  1. .net core 的优点

    [1]为什么使用.net core 首先.net core 是一个跨平台的高性能开源框架用具生成基于云连接的Internet的新的应用程序,可以建造web应用程序和服务,lot应用和移动后端,可以在W ...

  2. 批量生成python自动化测试脚本

    先前有家供应商与我们合作开发自动化工程,采用的py unittest作为脚本运行框架.我发现他们出的脚本都是挨个手写的,格式上也是参差不齐.所以有了根据用例表批量生成脚本的一段小代码 对一个测试脚本必 ...

  3. CentOS&.NET Core初试-4-安装守护服务(Supervisor)

    系列目录 CentOS的安装和网卡的配置 安装.NET Core SDK和发布网站 Nginx的安装和配置 安装守护服务(Supervisor) Supervisor是什么? Supervisor 是 ...

  4. inline-block BUG问题

    使用inline-block会使父元素高度不正常,要慎用!!!可以给父元素添加font-size:0解决,或者使用用float或者flex布局.

  5. $bzoj1014-JSOI2008$ 火星人$prefix$ $splay$ $hash$

    题面描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:\(madamimadam\),我们将这个字符串的各个字符予以标号: 序号 1 2 3 4 5 6 7 8 ...

  6. 使用swiper来实现轮播图

    使用swiper来实现轮播图 swiper实现轮播图几乎是没有一点点技术含量,但是用起来却很方便,包括对移动端的支持也很好. 由于简单这里当然就不会去详细介绍了,推荐两个网址: 1.http://ww ...

  7. 让EntityFramwork自动更新表结构

    在项目开发中,难免会遇到数据库表结构变化的情况,手动去维护数据库是一件繁琐的事情.好在EntityFramwork为我们这些懒人提供了可供自动更新数据结构的机制,废话不多说,直接上代码: 首先创建一个 ...

  8. 【随笔】Linux主机简单判断CC攻击的命令

    今天看到一个很有意思的命令tcpdump,在这里记录下. 如果想要看tcpdump的详细用法,可以点击这里. 什么是CC攻击? 关于CC攻击,这里引用百度的解释: CC攻击的原理就是攻击者控制某些主机 ...

  9. 9、在Shell脚本中调用其他脚本

    在Shell脚本的执行过程中,Shell脚本支持调用另一个Shell脚本,调用的格式为:程序名 实例:在Shell脚本test1中调用test2. 1.调用test2#test1脚本root@ubun ...

  10. html中 alt 和 title 的区别

    alt 用来给图片来提示的(图片载入失败时以文本形式提示). Title用来给链接文字或普通文字提示的(在鼠标放上去的时候就会提示).