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控件

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

  4. Android中ExpandableListView控件基本使用

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

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

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

  6. Android 中常见控件的介绍和使用

    1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...

  7. Android中常用控件及属性

    在之前的博客为大家带来了很多关于Android和jsp的介绍,本篇将为大家带来,关于Andriod中常用控件及属性的使用方法,目的方便大家遗忘时,及时复习参考.好了废话不多讲,现在开始我们本篇内容的介 ...

  8. WP8.1开发中ListView控件加载图列表的简单使用(1)

    我也是刚接触WP编程没几个月,就是在这段时间一直闲着没事,然后又比较喜欢WP这款系统,就学习了WP这方面的开发言语,自学是很困难的,掌握这方面的资料不多,很初级,就是自己在网上找资料学习过程中,看到别 ...

  9. 实例源码--Android的ListView控件的总结

    下载源码   技术要点: 1.ListView控件的总结 2.微信ListView气泡的实现 3.ListView仿优酷播放列表 4.ListView刷新列表 5.详细的源码注释 ...... 详细介 ...

随机推荐

  1. Android开发学习之路-LruCache使用和源码分析

    LruCache的Lru指的是LeastRecentlyUsed,也就是近期最少使用算法.也就是说,当我们进行缓存的时候,如果缓存满了,会先淘汰使用的最少的缓存对象. 为什么要用LruCache?其实 ...

  2. CSS之A标签

    a标签,超级链接 a是英语anchor锚的意思. a标签常用的就是三个属性: 1        <a href="网址" title="悬停文本" tar ...

  3. CPU的大小端模式

    不同体系结构的CPU,数据在内存中存放的排列顺序是不一样的. 存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大 ...

  4. JAVA之IO文件读写

    IO概述:                                                          IO(Input output)流 作用:IO流用来处理设备之间的数据传输 ...

  5. BZOJ 1116: [POI2008]CLO

    1116: [POI2008]CLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 922  Solved: 514[Submit][Status][ ...

  6. waf2控件名

    1,查询表格(queryGrid),编辑表格(editGrid) wafGrid 2,快速F7 wafPromptQuick 3,表格F7 wafPromptGrid 4,自定义F7 wafPromp ...

  7. 画六边形-mat

    %% theta = linspace(0,2*pi,7); D=2; %边长 X=1; %中心横坐标 Y=2; %中心纵坐标 plot(D*cos(theta)+X,D*sin(theta) + Y ...

  8. 查看网卡的流量 iptraf

    yum search iptraf Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds ...

  9. JQuery:JQuery删除元素

    JQuery:删除元素通过 jQuery,可以很容易地删除已有的 HTML 元素.删除元素/内容.如需删除元素和内容,一般可使用以下两个 jQuery 方法: remove() - 删除被选元素(及其 ...

  10. java.net.SocketException四大异常解决方案【转】

    java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketExceptio ...