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. HTML中的拖拉框----在路上(29)

    拖拽框---当鼠标按在指定的区域才可进行拖拽 思想:只有当鼠标是按在一个大div里的小div才可拖拽,其他不可:拖拽框有多种方法,这里以其中一种分享:下面使我自己写的demo,简单有效. <!D ...

  2. JVM学习(1)——通过实例总结Java虚拟机的运行机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms ...

  3. 【WP 8.1开发】如何处理摄像头翻转的问题

    模拟器就像我们儿时的梦境,在其上运行应用程序时,一切总是那么美好的:而真机测试如同我们这个纷乱无章的现实世界,你会遇到各种小人和畜生,常常会遭受莫名的挫折.面对挫折,有人迎难而上,或不予理采,走自己的 ...

  4. SharePoint 向多行文本类型字段插入特殊类型链接

    1.在测试列表中插入一个多行文本字段,名字叫做Content,如下图: 2.在Content字段里,添加一个Link,如下图: 3.尝试输入Notes格式的Link,如下图: 4.点击OK的时候,弹出 ...

  5. 不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据

    概要: 使用jdbc 如果在不知道表结构的情况下,如何读出表信息? 使用ResultSetMetaData; 然后使用getColumnType 获取column 类型 使用getColumnName ...

  6. WeX5学习笔记-建立项目且从SVN获取版本

    UI2项目(app项目)建立步骤: 1.从网上获得WeX5_V3.1.1.zip 文件,在某盘根目录下,创建一个文件,起名尽量短小,因开发包里的文件目录层次很深,有时会报路径长度超出范围的提示,如创建 ...

  7. poj1166学习中

    #include <iostream> #include <string.h> #include <cstdio> #include <cmath> u ...

  8. Springmvc返回JSON乱码问号

    @RequestMapping(value="/book/getBook.do", produces = "text/html;charset=UTF-8") ...

  9. MATLAB代码加密生成.p文件

    代码就下面一句话: pcode yourfile.m 生成的 yourfile.p就是你的加密文件,别人是看不到代码的,调用和m文件调用一样.

  10. Best Time to Buy and Sell Stock

    class Solution { public: int maxProfit(vector<int>& prices) { //eg: 5 6 2 3 1 4: // 记录i之前最 ...