android listview 最大行数,android中的ListView数据量大时如何提高效率。。。。

数据量大,这牵涉到2个问题。

1. 一个空ListView加载的数据项很多

2. 已加载很多数据项的ListView如何优化效率

对于问题1:一个空ListView加载的数据项很多

一般就是动态加载,仅在需要加载的时候加载数据项。

比如View只能显示10项,当滚动到第10项时,我们才加载后面的N(N根据实际情况判定)项。

这就需要监听滚动消息,很好,ListView有这个回调(onScroll和onScrollStateChanged),我们结合这二个重载的函数,检查当滚动状态改变,

即滚动到底部时,我们就加载这N项。

具体用法请见我下面引用的参考文章1:

对于问题2:已加载很多数据项的ListView如何优化效率

一般ListView数据量大时,效率地下的瓶颈在getView函数中,我们需要优化,就是尽可能的减少重复的,无意义的操作。

普遍的做法都是将当前显示的view绑定一个结构题,下次我们只要获取这个结构题就OK了。

具体用法,见参考文章2:

参考文章1:ListView动态加载数据

地址:http://blog.csdn.net/liuhe688/article/details/6852523

熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容。通常来说,一个应用在展现大量数据时,不会将全部的可用数据都呈现给用户,因为这不管对于服务端还是客户端来说都是不小的压力,因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。比如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个“加载更多”按钮,用户点击后,加载下一页数据。

我们今天就结合实例来演示一下使用ListView获取数据的过程。

新建一个loadmore项目,我们来看一下结构图和最终效果图:

64541671_1.gif 

64541671_2.gif

左图中包含了三个布局文件、一个Adapter和一个Activity,右图是我们运行后的主界面。

其中,main.xml是主界面的布局文件,它包含一个ListView组件,代码如下:

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:paddingLeft="3dp"

android:paddingRight="3dp">

android:id="@id/android:list"

android:layout_width="fill_parent"

android:layout_height="wrap_content"/>

这里我们引用了Android内置的名为list的id,因为我们后面要使用到ListActivity,我们的MainActivity继承于它。

然后就是list_item.xml,它是ListView中单个列表项的布局文件,从效果图中可以看到,这里只使用到了一个TextView组件,list_item.xml代码如下:

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:id="@+id/list_item_text"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:gravity="center"

android:textSize="20sp"

android:paddingTop="10dp"

android:paddingBottom="10dp"/>

我们注意到在右图中列表底部有一个按钮不同于其他的列表项,这是什么情况?事实上这个按钮是我们在ListView底部添加的一个视图。ListView组件提供了两个很实用的功能,那就是可以在顶部和底部添加自定义的视图。我们在此处ListView的底部添加了一个视图用来加载更多数据,这个视图对应着load_more.xml布局文件,代码如下:

xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

android:id="@+id/loadMoreButton"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="load more"

android:onClick="loadMore"/>

接下来我们来了解一下我们的Adapter,ListViewAdapter代码如下:

packagecom.scott.loadmore;

importjava.util.List;

importandroid.content.Context;

importandroid.view.LayoutInflater;

importandroid.view.View;

importandroid.view.ViewGroup;

importandroid.widget.BaseAdapter;

importandroid.widget.TextView;

publicclassListViewAdapterextendsBaseAdapter {

privateList items;

privateLayoutInflater inflater;

publicListViewAdapter(Context context, List items) {

this.items = items;

inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

@Override

publicintgetCount() {

returnitems.size();

}

@Override

publicObject getItem(intposition) {

returnitems.get(position);

}

@Override

publiclonggetItemId(intposition) {

returnposition;

}

@Override

publicView getView(intposition, View view, ViewGroup parent) {

if(view ==null) {

view = inflater.inflate(R.layout.list_item, null);

}

TextView text = (TextView) view.findViewById(R.id.list_item_text);

text.setText(items.get(position));

returnview;

}

/**

* 添加列表项

* @param item

*/

publicvoidaddItem(String item) {

items.add(item);

}

}

这个ListViewAdapter是我们自定义适配器,它继承自BaseAdapter,实例化此适配器需要一个Context对象来获取LayoutInflater实例和一个集合对象来充当适配器的数据集;在getView方法中我们填充list_item.xml布局文件,完成列表每一项的数据显示;addItem方法用来在加载数据时向数据集中添加新数据。

最后我们来看一下MainActivity:

packagecom.scott.loadmore;

importjava.util.ArrayList;

importandroid.app.ListActivity;

importandroid.os.Bundle;

importandroid.os.Handler;

importandroid.util.Log;

importandroid.view.View;

importandroid.widget.AbsListView;

importandroid.widget.AbsListView.OnScrollListener;

importandroid.widget.Button;

importandroid.widget.ListView;

publicclassMainActivityextendsListActivityimplementsOnScrollListener {

privateListView listView;

privateintvisibleLastIndex =0;//最后的可视项索引

privateintvisibleItemCount;// 当前窗口可见项总数

privateListViewAdapter adapter;

privateView loadMoreView;

privateButton loadMoreButton;

privateHandler handler =newHandler();

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

loadMoreView = getLayoutInflater().inflate(R.layout.load_more, null);

loadMoreButton = (Button) loadMoreView.findViewById(R.id.loadMoreButton);

listView = getListView();               //获取id是list的ListView

listView.addFooterView(loadMoreView);   //设置列表底部视图

initAdapter();

setListAdapter(adapter);                //自动为id是list的ListView设置适配器

listView.setOnScrollListener(this);//添加滑动监听

}

/**

* 初始化适配器

*/

privatevoidinitAdapter() {

ArrayList items = newArrayList();

for(inti =0; i <10; i++) {

items.add(String.valueOf(i + 1));

}

adapter = newListViewAdapter(this, items);

}

/**

* 滑动时被调用

*/

@Override

publicvoidonScroll(AbsListView view,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount) {

this.visibleItemCount = visibleItemCount;

visibleLastIndex = firstVisibleItem + visibleItemCount - 1;

}

/**

* 滑动状态改变时被调用

*/

@Override

publicvoidonScrollStateChanged(AbsListView view,intscrollState) {

intitemsLastIndex = adapter.getCount() -1;//数据集最后一项的索引

intlastIndex = itemsLastIndex +1;//加上底部的loadMoreView项

if(scrollState == OnScrollListener.SCROLL_STATE_IDLE && visibleLastIndex == lastIndex) {

//如果是自动加载,可以在这里放置异步加载数据的代码

Log.i("LOADMORE","loading...");

}

}

/**

* 点击按钮事件

* @param view

*/

publicvoidloadMore(View view) {

loadMoreButton.setText("loading...");//设置按钮文字loading

handler.postDelayed(newRunnable() {

@Override

publicvoidrun() {

loadData();

adapter.notifyDataSetChanged(); //数据集变化后,通知adapter

listView.setSelection(visibleLastIndex - visibleItemCount + 1);//设置选中项

loadMoreButton.setText("load more");//恢复按钮文字

}

}, 2000);

}

/**

* 模拟加载数据

*/

privatevoidloadData() {

intcount = adapter.getCount();

for(inti = count; i 

adapter.addItem(String.valueOf(i + 1));

}

}

}

如代码所示,我们在onCreate方法被调用时获取listView组件,设置其底部视图为loadMoreView,它包含一个按钮,点击时会触发loadMore方法调用,另外在为listView设置完适配器时,又为其设置了滑动事件监听器,滑动列表时onScroll会被调用,滑动状态改变时onScrollStateChanged会被调用。

我们来演示一下这个加载过程:

64541671_3.gif 

64541671_4.gif

如图,当点击完按钮后,出现加载动作,加载完之后如右图所示,新数据紧接在原数据之后。然后我们滑动到底部,加载按钮仍可工作:

64541671_5.gif

最后,我们测试一下滑动列表到底部,然后松开,控制台打印如下:

64541671_6.gif

我们看到onScrollStateChanged方法里的if语句里代码执行了,所以如果我们希望自动加载的话,可以把加载代码放于此处。

今天先讲到这里,谢谢大家。

参考文章2: 优化ListView的滚动效率

地址:http://blog.csdn.net/z104207/article/details/6667829

如何提高ListView的滚动速度,ListView的滚动速度的提高在于getView方法的实现,通常我们的getView方法会这样写:

View getView(intposition,View convertView,ViewGroup parent){

//首先构建LayoutInflater

LayoutInflater factory = LayoutInflater.from(context);

View view = factory.inflate(R.layout.id,null);

//然后构建自己需要的组件

TextView text = (TextView) view.findViewById(R.id.textid);

.

.

returnview;

}

这样ListView的滚动速度其实是最慢的,因为adapter每次加载的时候都要重新构建LayoutInflater和所有你的组件.而下面的方法是相对比较好的:

View getView(intposition,View contertView,ViewGroup parent){

//如果convertView为空,初始化convertView

if(convertView ==null)

{

LayoutInflater factory = LayoutInfater.from(context);

convertView = factory.inflate(R.layout.id,null);

}

//然后定义你的组件

(TextView) convertView.findViewById(R.id.textid);

returnconvertView;

}

这样做的好处就是不用每次都重新构建convertView,基本上只有在加载第一个item时会创建convertView,这样就提高了adapter的加载速度,从而提高了ListView的滚动速度.而下面这种方法则是最好的:

//首先定义一个你 用到的组件的类:

staticclassViewClass{

TextView textView;

.

.

}

View getView(intposition,View convertView,ViewGroup parent){

ViewClass view ;

if(convertView ==null){

LayoutInflater factory = LayoutInflater.from(context);

convertView = factory.inflate(R.layout.id,null);

view = newViewClass();

view.textView = (TextView)

convertView.findViewById(R.id.textViewid);

.

.

convertView.setTag(view);

}else{

view =(ViewClass) convertView.getTag();

}

//然后做一些自己想要的处理,这样就大大提高了adapter的加载速度,从而大大提高了ListView的滚动速度问题.

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

從三種方式看SQL的使用程度

以下三種方式﹐實現的是同一功能﹐也是我同一天中實現 的三種方式。記載在這里不為別的﹐只為對自己一點SQL的小小總結吧。 UpdateTEMP_PP_SH_MFG_SCH SetMFG_SCH_JOBNO Left(MFG_SCH_JOBNO,6)CASELEN(RIGHT(MFG_SCH_JOBNO,4)ID) WHEN1THE…

android手机用多久会卡机,你知道Android手机用久了会卡,而iPhone则不会是为什么吗?...

原标题&#xff1a;你知道Android手机用久了会卡&#xff0c;而iPhone则不会是为什么吗&#xff1f;如果有人问为什么iPhone能成为手机行业当之无愧的领头羊&#xff1f;为什么那么多人抢着入手iPhone X&#xff1f;为什么黄牛只会炒iPhone手机。我想大多数人的回答就是&#x…

BaaS后端即服务 - 概念篇

摘要&#xff1a; 什么是BaaS&#xff1f; BaaS&#xff08;Backend as a Service&#xff09;是一种新型的云服务&#xff0c;旨在为移动和Web应用提供后端云服务&#xff0c;包括云端数据/文件存储、账户管理、消息推送、社交媒体整合等。BaaS是垂直领域的云服务&#xff0c;…

使用maven构建的Spring boot项目在开始搭建的时候出的一些错误

首先&#xff0c;先构建一个maven项目&#xff0c;构建好了之后&#xff0c;会有一个错误,先说明一下&#xff0c;我生成maven项目时jre给我自动选择的是1.5版本的&#xff0c;而本人安装的是1.8的 然后&#xff0c;我们要消除这个错误&#xff0c;发现是缺少了一个javax.servl…

用计算机计算性别,2018预测生男生女计算器 超准的怀孕计算器查生男生女

外面的大雪不管是如羽毛般飘飞的浪漫还是积雪的盛装都会让夫妻感受到爱情的情愫&#xff0c;有的人在这个时候也计划着在2018年的时候备孕&#xff0c;但是对于各种算术以及数字都难不倒的备孕爸妈来说什么算术都是小菜一碟&#xff0c;2018预测生男生女计算器更是他们的福音&a…

html分享插件,10个jQuery插件分享

10个jQuery插件分享Sponsor发觉现在国外的前端人员很有创意&#xff0c;每个精品jQuery插件大部分来自国外&#xff0c;所以我很欣赏他们。今天为大家带来一些有意思的jQuery插件&#xff0c;这些jQuery有图片类插件、Tool Tips类插件、文字、绘图、排版等&#xff0c;我想这些…

OCR识别算法深入分析手机端车牌识别

一、手机端车牌识别OCR识别流程 车牌识别是基于OCR识别的一用应用。手机端车牌识别过程包括图像采集、图像预处理、车牌定位、字符分割、字符识别、输出结果等一系列算法运算&#xff0c;其流程如下图所示&#xff1a; 其中图像采集是通过视频流识别&#xff0c;对视频进行解帧…

org.springframework.beans.factory.BeanDefinitionStoreExcept

今天写了一个spring的测试demo 新建一个UserWzy类 新建一个spring的配置文件放在src目录下 新建一个测试类 运行报错如下 解决办法&#xff1a; 把配置文件放在resources目录下 再次启动 可以看到了输出了对象的地址

国开计算机应用基础中考答案,国开计算机应用基础模块4PowerPoint2010电子演示文稿系统答案...

"在PoewrPoint中&#xff0c;“视图”这个名词表示( )。: 一张正在修改的幻灯片; 一种图形; 显示幻灯片的方式; 编辑演示文稿的方式""在下列PowerPoint的各种视图中&#xff0c;可编辑、修改幻灯片内容的视图是( )。: 普通视图; 幻灯片浏览视图; 都可以; …

手动加载spring, ApplicationContext怎么销毁

手动加载spring&#xff0c; ApplicationContext怎么销毁 AbstractApplicationContext context new ClassPathXmlApplicationContext("bean6.xml");Orders orders context.getBean("factoryBean", Orders.class);System.out.println("第四部 获取创…

iOS开发 - App程序启动原理

Info.plist和pch文件的作用 建立一个project后&#xff0c;会在Supporting files目录下看到一个“project名-Info.plist”的文件&#xff0c;该文件对project做一些执行期的配置。很重要&#xff0c;不能删除 在旧版本号Xcode创建的project中。这个配置文件的名字就叫“Info.pl…

SpringFramework5.0 @Indexed注解 简单解析

使用场景 在应用中有大量使用ComponentScan扫描的package包含的类越多的时候&#xff0c;Spring模式注解解析耗时就越长。 使用方法 在项目中使用的时候需要导入一个spring-context-indexer jar <dependency><groupId>org.springframework</groupId><…

MaC 修改MySQL密码

1.苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务&#xff08;点击stop mysql server&#xff09; 2.进入终端输入&#xff1a;cd /usr/local/mysql/bin/ 回车后 登录管理员权限 sudo su 回车后输入以下命令来禁止mysql验证功能 ./mysqld_safe --skip-g…

正则学习:组的定义及引用方式

一个正则表达式匹配结果可以分成多个部分&#xff0c;这就是组(Group).把一次Match结果用(?<name>)的方式分成组,例子:publicstaticvoidMain() {  string s "2005-2-21";  Regex reg new Regex("(?<y>…

html两个盒子怎么左右对其,关于html:在同一行上左右对齐两个内联块

如何对齐两个内联块&#xff0c;以便一个在左边&#xff0c;另一个在同一行&#xff1f; 为什么这么难&#xff1f; 是否有类似LaTeX的 hfill这样的东西可以占用它们之间的空间来实现这一目标&#xff1f;我不想使用浮点数&#xff0c;因为有了内联块&#xff0c;我可以将基线对…

Blog小技巧之二-让朋友在Blog上也能QQ到自己

首先打开“[url]http://is.qq.com/cgi-bin/webpresence/wpa_code?uin123456789[/url]”&#xff0c;把上面的123456789换成对方的QQ号。 然后选择想要的会话图片和提示。在“点击生成代码”中我们选择生成网页代码&#xff0c;这时我们可以得到一段网页代码&#xff0c;把它粘…

springboot 设置server.port不失效原因

配置服务启动的端口时&#xff0c;springboot默认在application.properties配置文件中提供了server.port配置项,但是启动后没有生效&#xff0c;其实该配置项要想生效其实是依赖于项目中内嵌的tomcat容器 内嵌tomcat的jar包依赖包含在pom中 <dependency><groupId>o…

计算机科学学院陈瑜,浙江大学城市学院计算机与计算科学学院 计算机科学与技术 陈则伦...

陈则伦省级优秀毕业生计算机1202所获奖项及荣誉&#xff1a;国家奖学金、学业优秀二等奖学金、学科竞赛优秀奖学金(团体一等)、学院“三好学生”荣誉称号、学业优秀二等奖学金2次、学科竞赛优秀奖学金(团体一等)、学科竞赛个人优秀二等奖学金2次、学院“三好学生”荣誉称号学科…