Android中ListView控件的使用

ListView展示数据的原理

  在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet,

  适配器的作用

    Adapter的作用就是把数据展示在Listview中

使用ListView的奇怪问题?

   在使用ListView的时候,如果把ListView的高设置为wrap_content,它会反复读取多次数据,然后在ListView中把数据显示出来,效率非常低,,这时候我们应该把ListView的高设置为match_parent,这样就能很好的解决读取多次再显示数据的问题了,因为ListView的高写成wrap_content,那么它的高不确定的,需要做多次的校验,确认数据是否能完全显示出来。

  下面我们通过案例说明这个问题

  

  当ListViewf控件的高度设置为wrap_content时,就会出现以下问题,如下图:

          

               图1                              图2

  我们可以看到手机屏幕图1中最多能够显示31条数据,但是图2中很明显看到当加载完31条记录时,紧接着又从0开始加载这31条记录,其实后面还加载了好几次,在这里就不一一截图出来了,那么如何解决呢?其实只需要修改一下ListView控件的高就可以了,把ListView控件中的高设置为match_parent

  

  但是还要注意一点,当是引入布局的时候,我们也需要设置它的父元素的高为match_parent

  

  也就是说,父元素和引入布局的ListView都需要设置为match_parent

    

  ListView控件的父子关系关系也是一样

  

  

  解决了读取多次数据问题后,我们来看看以下代码,然后运行看看结果是怎样的?

 import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.weixin); //获取所需控件
ListView ll = (ListView) findViewById(R.id.listView1); //使用适配器
ll.setAdapter(new MyAdapter()); } //定义一个适配器
private class MyAdapter extends BaseAdapter{ //返回条目数
@Override
public int getCount() {
return 10000;
} @Override
public Object getItem(int position) { return null;
} @Override
public long getItemId(int position) { return 0;
} /**
* 获取一个view,用来显示listView的数据,会作为listView的一个条目显示
*
* position : 对应getCount()返回的索引
* convertView : 缓存数据的对象
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) { /**
* 如果convertView是null,那么说明没有缓存,那么我们就创建TextView对象
*/
TextView tv = tv = new TextView(MainActivity.this);
System.out.println("创建新的View"+position); tv.setText("呵呵"+position);
return tv;
} }
}

  运行结果:

     

  我们从结果可以看到,每次都是创建了一个新的对象,这样效率非常低,那么我们下面进行ListView的优化

ListView的优化策略

   

 package com.example.uicustomviews;

 import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.weixin); //获取所需控件
ListView ll = (ListView) findViewById(R.id.listView1); //使用适配器
ll.setAdapter(new MyAdapter()); } //定义一个适配器
private class MyAdapter extends BaseAdapter{ //返回条目数
@Override
public int getCount() {
return 10000;
} @Override
public Object getItem(int position) { return null;
} @Override
public long getItemId(int position) { return 0;
} /**
* 获取一个view,用来显示listView的数据,会作为listView的一个条目显示
*
* position : 对应getCount()返回的索引
* convertView : 缓存数据的对象
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) { TextView tv = null; /**
* 如果convertView是null,那么说明没有缓存,那么我们就创建TextView对象
*/
if(convertView==null){
System.out.println("创建新的View"+position);
tv = new TextView(MainActivity.this);
}else{
/**
* 否则就是有缓存,为了提高效率,那么我们就使用缓存中对象,不需要再次new了
*/
tv = (TextView) convertView ;
System.out.println("使用缓存的View"+position);
} tv.setText("呵呵"+position);
return tv;
} }
}

  运行结果如下图:  

      

  显然提高了效率,不再创建新的View,而是使用了缓存中的View

  下面我们把一个布局文件转为一个View(ListView中的一个条目)

 package com.example.uicustomviews;

 import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.weixin); //获取所需控件
ListView ll = (ListView) findViewById(R.id.listView1); //使用适配器
ll.setAdapter(new MyAdapter()); } //定义一个适配器
private class MyAdapter extends BaseAdapter{ //返回条目数
@Override
public int getCount() {
return 10000;
} @Override
public Object getItem(int position) { return null;
} @Override
public long getItemId(int position) { return 0;
} /**
* 获取一个view,用来显示listView的数据,会作为listView的一个条目显示
*
* position : 对应getCount()返回的索引
* convertView : 缓存数据的对象
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) { /**
* 可以插入广告
*/ View view = null; /**
* 如果convertView是null,那么说明没有缓存,那么我们就创建TextView对象
*/
if(convertView==null){
//System.out.println("创建新的View"+position);
//创建一个新的View对象,可以通过打气筒把一个布局资源转换成一个View对象
70 //resource就是我们定义好的布局文件
//方式一
//view = View.inflate(MainActivity.this, R.layout.weixin_item, null); //方式二
//view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.weixin_item, null); //方式三
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.weixin_item, null);
}else{
/**
* 否则就是有缓存,为了提高效率,那么我们就使用缓存中对象,不需要再次new了
*/
view = convertView ;
//System.out.println("使用缓存的View"+position);
} return view;
} }
}

Android中ListView控件的使用的更多相关文章

  1. android中ListView控件&&onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

  2. Android中ListView 控件与 Adapter 适配器如何使用?

    一个android应用的成功与否,其界面设计至关重要.为了更好的进行android ui设计,我们常常需要借助一些控件和适配器.今天小编在android培训网站上搜罗了一些有关ListView 控件与 ...

  3. android中ListView控件最简单的用法

    创建一个活动,在xml文件中添加一个ListView控件,id定义为list1,并且设置为满屏显示,代码如下: <ListView android:id="@+id/list1&quo ...

  4. android中ListView控件

    今天学习了ListView控件和页面跳转,下面大致介绍下: 第一步:创建显示内容的文件vlist.xml: <?xml version="1.0" encoding=&quo ...

  5. Android中ExpandableListView控件基本使用

    本文採用一个Demo来展示Android中ExpandableListView控件的使用,如怎样在组/子ListView中绑定数据源.直接上代码例如以下: 程序结构图: layout文件夹下的 mai ...

  6. android中RecyclerView控件实现点击事件

    RecyclerView控件实现点击事件跟ListView控件不同,并没有提供类似setOnItemClickListener()这样的注册监听器方法,而是需要自己给子项具体的注册点击事件. 本文的例 ...

  7. C# winform项目中ListView控件使用CheckBoxes属性实现单选功能

    C# winform项目中ListView控件使用CheckBoxes属性实现单选功能 在做项目时需要使用ListView控件的CheckBoxes属性显示,还要在点击行时自动选中CheckBoxes ...

  8. android中RecyclerView控件实现瀑布流布局

    本文是在之前文章的基础上做的修改:android中RecyclerView控件的使用 1.修改列表项news_item.xml: <?xml version="1.0" en ...

  9. android中RecyclerView控件的列表项横向排列

    本文是在上一篇文章的基础上做的修改:android中RecyclerView控件的使用 1.修改列表项news_item.xml:我这里是把新闻标题挪到了新闻图片的下面显示 <?xml vers ...

随机推荐

  1. mmorpg手游中的战斗系统

    目前的项目是一款mmorpg手游, 非常不幸的是,当前战斗系统的实现非常脆弱, 也毫无技巧可言.具体存在如下问题: 1.战斗层逻辑与自动战斗AI逻辑混在一起, 互相纠缠. 2.战斗层自身逻辑混乱不堪, ...

  2. Numpy Study 2----* dot multiply区别

    使用numpy时,跟matlab不同: 1.* dot() multiply() 对于array来说,* 和 dot()运算不同 *是每个元素对应相乘 dot()是矩阵乘法 对于matrix来说,* ...

  3. c#基础3

    Console.WriteLine("屏幕显示的内容"); Console.Write("屏幕显示的内容"); 两者区别是:Console.WriteLine( ...

  4. 十天精通CSS3学习笔记 part2

    第6章 征服CSS3选择器(上) 属性选择器 在HTML中,通过各种各样的属性可以给元素增加很多附加的信息.例如,通过id属性可以将不同div元素进行区分. 在CSS2中引入了一些属性选择器,而CSS ...

  5. node.js + webstorm :配置开发环境

    一.配置开发环境: 1.先安装node (1).访问http://nodejs.org打开安装包,正常安装,点击next即可. 为了测试是否安装成功,打开命令提示符,输入node,则进入node.js ...

  6. 数字图像处理作业使用OpenCV - 配置

    使用环境:Windows7 旗舰版 + vs2008 + OpenCV2.0a 基本上配置都是通过网上一个教程,在此附上地址 Click ME. 为了避免因不同版本而出现的安装问题,我还是下载了2.0 ...

  7. 推荐两个谷歌的json-view插件(附带下载分享地址)

    1.JSONView 网盘下载地址:http://pan.baidu.com/s/1hrGlaVa 效果图: 2.JSON-handle 网盘下载地址:http://pan.baidu.com/s/1 ...

  8. 判断 iframe 是否加载完成的完美方法

    一般来说,我们判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似:var iframe = document.createElement(" ...

  9. Python笔记总结week1

    1. Python介绍: 发明者:Guido 应用范围:网络应用.科学运算.GUI程序.系统管理工具.其他程序 优势:简单易懂.开发效率高.高级语言.可移植性.可扩展性.可嵌入性. 缺点:速度慢,代码 ...

  10. interface

    接口的简单案例: 接口 就是一种规范 其目的主要是为了约束和解耦 public class Test { public static void main(String[] args){ Compute ...