Android学习——ListView的缓存机制
在使用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的缓存机制的更多相关文章
- Android笔记(二十五) ListView的缓存机制与BaseAdapter
之前接触了ListView和Adapter,Adapter将数据源和View连接起来,实际应用中,我们要显示的数据往往有很多,而屏幕只有那么大,系统只能屏幕所能显示的内容,当我们滑动屏幕,会将旧的内容 ...
- 探究ListView 的缓存机制
概述 ListView 是继承AbListView,AbListView是所有列表类控件的基类. ListView的数据加载 在ListView数据加载中最关键的一个函数就是makeAndAddVie ...
- 九、Android学习第八天——广播机制与WIFI网络操作(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...
- android 视频的缩略图 缓存机制和 异步加载缩略图
在这次的工作开发项目中,涉及到一个视频缩略图的视频列表:这个在大家看来,制作视频缩略图就是两行代码就搞定的事.确实是这样的,百度一下,每个帖子都知道制作视频缩略图的方法,在这里确实也是一样的,但是我要 ...
- 学习ASP.NET缓存机制
缓存是大型BS架构网站的性能优化通用手段,之前知道有这个概念,并且也知道很重要,但是一直没静下心来了解.这次借着学习PetShop源码的机会熟悉一下ASP.NET基本的缓存机制(生产环境中的真实缓存有 ...
- Android学习---ListView和Inflater的使用,将一个布局文件转化为一个对象
本文将介绍ListView和Inflater的使用,将接上一篇文章内容. 一.什么是ListView? 在android开发中ListView是比较常用的控件,ListView 控件可使用四种不同视图 ...
- Android学习--ListView
这篇文章用于总结自己这两天学到的安卓的ListView和RecyclerView 的笔记,以及从我这个iOS开发者的角度去理解和学习这两个控件,会比较一下他们个iOS中那些控件是一致的,可以用来对比的 ...
- android 学习 ListView使用补充
前面两篇学习适配器的时候用的就是listview,主要是简单的添加,今晚在看了下listview滚动状态事件和动态加载数据,一个小demo. listview的滚动状态主要有三种,onScrollSt ...
- Android学习---ListView的点击事件,simpleAdapter和arrayadapter,SimpleCursoAdapter的原理和使用
如题,本文将介绍 listview的点击事件,simpleAdapter和arrayadapter的原理和使用. 1.ListView的注册点击事件 //注册点击事件 personListView.s ...
随机推荐
- Shiro源码解析-登录篇
本文以循序渐进的方式解析Shiro整个login过程的处理,读者可以边阅读本文边自己看代码来思考体会,如有问题,欢迎评论区探讨! 笔者shiro的demo源码路径:https://github.com ...
- 10g 升级到11g 失效对象2则
########SAMPLE 0 Invalid X_$ Views & Synonyms After Upgrading to 11g (文档 ID 878623.1) Those view ...
- SAP Sybase IQ 操作基础
1.启动 source IQ-16_0.sh 命令行查看安装程序是否成功 start_iq -v2 2.数据库.表空间 start_iq -n utility_db dbisql -c 'uid=db ...
- 案例16-validate自定义校验规则校验用户名是否存在
1 知识点 2 register.jsp代码 注意自定义校验规则的时候,提交必须是同步的方式. <%@ page language="java" contentType=&q ...
- Orcale 之子查询
子查询和连接查询一样,都提供了使用单个查询访问多个表中的数据的方法.子查询在其他查询的基础上,提供一种进一步有效的方式来访问数据. IN 关键字 使用 IN 关键字可以将原表中特定的的值与子查询中返回 ...
- html中文乱码(解决办法)
在head标签中加上以下代码即可: <head> <meta http-equiv="Content-Type" content="text/h ...
- git 自己创建了一个项目A,我的同事fork一个B,当我的项目更新的时候,怎么样在他fork的repo上进行相应的更新?
先把B clone到本地 git clone B_REPOSITORY_URL 再cd到本地B的目录,把A作为一个remote加到本地的B中(一般命名为upstream) git remote add ...
- Javascript替代eval方法
Javascript替代eval方法 通常我们在使用ajax获取到后台返回的json数据时,都要使用 eval 这个方法将json字符串转换成对象数组, 像这样: obj = eval('('+dat ...
- 计算F1Score
计算F1Score predictions = pval < epsilon fp = sum((predictions == 1) & (y == 0)) fn = sum((pred ...
- Java入门系列-18-抽象类和接口
抽象类 在第16节继承中,有父类 People People people=new People(); people.sayHi(); 实例化People是没有意义的,因为"人"是 ...