1. public View getView(int position, View convertView, ViewGroup parent) {////convertView是一个缓存,每次返回一个layout给系统,安卓系统根据layout的布局和数据进行显示,
  2. //这个layout同时会保存在convertView中,convertView缓存layout的个数为屏幕显示的列表的个数,
  3. //但屏幕滚动的时候,会删除出屏幕了的数据加进新显示的数据,保证同一时间仅仅显示一个屏幕的数量的数据。
  4. View layout=View.inflate(MainActivity.this, R.layout.item_generals, null);
  5. }

MainActivity.java

  1. package com.sxt.day05_10;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import com.sxt.day05_10.entity.ContactBean;
  7.  
  8. import android.os.Bundle;
  9. import android.app.Activity;
  10. import android.util.Log;
  11. import android.view.Menu;
  12. import android.view.View;
  13. import android.view.ViewGroup;
  14. import android.widget.BaseAdapter;
  15. import android.widget.ListView;
  16. import android.widget.TextView;
  17.  
  18. public class MainActivity extends Activity {
  19.  
  20. //MVC
  21. ListView mlvContact;
  22. List<ContactBean> mContacts;
  23. ContactAdapter mAdapter;
  24.  
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_main);
  29. initData();
  30. initView();
  31. }
  32.  
  33. private void initView() {
  34. mlvContact=(ListView) findViewById(R.id.lvContact);
  35. mAdapter=new ContactAdapter(mContacts, this);//这里通过构造器将数据穿进去,好处是低耦合,内部类和外部类仅仅通过构造器进行数据的传递,没有别的地方有关联。以后将内部类提取出去成外部类的时候修改的代码量会少。
  36. mlvContact.setAdapter(mAdapter);
  37. }
  38.  
  39. private void initData() {
  40. String[] names=getResources().getStringArray(R.array.names);//字符串数组资源
  41. String[] phones=getResources().getStringArray(R.array.phones);
  42. mContacts=new ArrayList<ContactBean>();
  43. for (int i = 0; i < phones.length; i++) {
  44. ContactBean contact=new ContactBean(names[i], phones[i]);
  45. mContacts.add(contact);
  46. }
  47. }
  48.  
  49. class ContactAdapter extends BaseAdapter{
  50. List<ContactBean> contacts;
  51. MainActivity context;
  52.  
  53. public ContactAdapter(List<ContactBean> contacts, MainActivity context) {
  54. super();
  55. this.contacts = contacts;
  56. this.context = context;
  57. }
  58.  
  59. @Override
  60. public int getCount() {
  61. return contacts.size();
  62. }
  63.  
  64. @Override
  65. public Object getItem(int position) {
  66. // TODO Auto-generated method stub
  67. return null;
  68. }
  69.  
  70. @Override
  71. public long getItemId(int position) {
  72. // TODO Auto-generated method stub
  73. return 0;
  74. }
  75.  
  76. @Override
  77. public View getView(int position, View convertView, ViewGroup parent) {
  78. //convertView是一个缓存,缓存一屏幕数量的列表项,缓存是一个convertView缓存一个holder,一个hoder就是一条数据
  79. Log.i("main","position="+position);//如果一屏幕有10条,则第一屏getView函数调用10次,分别打印0-9,
  80. ViewHolder holder=null;
  81. if(convertView==null){//第一屏中没有返回那个layout所以convertView这个缓存为null,因为是新的所以convertView和holder都要重新创建并把holder加入convertView中,
  82. convertView=View.inflate(context, R.layout.item_contact, null);//将资源文件item_contact.xml创建出来
  83. holder=new ViewHolder();
  84. holder.tvName=(TextView) convertView.findViewById(R.id.tvName);
  85. holder.tvPhone=(TextView) convertView.findViewById(R.id.tvPhone);
  86. convertView.setTag(holder);//tag属性是View类的属性,是Object类型,现在convertView里面有了一屏幕数量的列表项数据了(一个convertView缓存一个holder)。
  87. }else{//以后的滚动,出现其他的列表项,直接从缓存中取出来(旧的布局,convertView和holder已经存在了并且已经加入进去了,但是数据还是要重新设置进去)
  88. holder=(ViewHolder) convertView.getTag();
  89. }
  90. //新的数据出现在屏幕的时候调用
  91. ContactBean contact=contacts.get(position);
  92. holder.tvName.setText(contact.getName());
  93. holder.tvPhone.setText(contact.getPhone());
  94. return convertView;//系统根据convertView进行显示
  95. }
  96.  
  97. class ViewHolder{
  98. TextView tvName,tvPhone;
  99. }
  100. }
  101. }

main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent">
  4.  
  5. <ListView
  6. android:id="@+id/lvContact"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent" layout_heightlayout_width都要设置成match_parent,否则不能利用缓存机制
  9. android:divider="#ccc"
  10. android:dividerHeight="10dp"/>
  11.  
  12. </RelativeLayout>
  1. item_contact.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="horizontal" >
  6.  
  7. <TextView
  8. android:id="@+id/tvName"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:textSize="20sp"
  12. android:text="张飞"/>
  13. <TextView
  14. android:id="@+id/tvPhone"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:text="13577889966"
  18. android:layout_marginLeft="10dp"
  19. android:textSize="20sp"/>
  20.  
  21. </LinearLayout>

ContactBean.java

  1. public class ContactBean {
  2.  
  3. private String name;
  4. private String phone;
  5. public String getName() {
  6. return name;
  7. }

android 34 ListView进阶的更多相关文章

  1. 我的Android进阶之旅------>Android二级ListView列表的实现

    实现如下图所示的二级列表效果 首先是在布局文件中,布局两个ListView,代码如下: <LinearLayout xmlns:android="http://schemas.andr ...

  2. 转--Android实现ListView过滤功能,继承于BaseAdapter,非ArrayAdapter。

    其实实现ListView过滤功能最方便的便是使用ArrayAdapter,里面自带的getFilter()方法能很方便的实现此功能,但是在实际的开发中,一般都是继承于BaseAdapter.还有一种是 ...

  3. Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...

  4. android中listView下拉刷新

    Android的ListView是应用最广的一个组件,功能强大,扩展性灵活(不局限于ListView本身一个类),前面的文章有介绍分组,拖拽,3D立体,游标,圆角,而今天我们要介绍的是另外一个扩展Li ...

  5. Android—万能ListView适配器

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...

  6. Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)

    昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...

  7. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  8. Android中ListView的几种常见的优化方法

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...

  9. android——自定义listView

    都知道微信主机面 有个界面会一行一一行的聊天记录,那个效果就可以用listview来实现(当然这只是其中的一种) listView是一种比较常见的组件它用来展示列的view,它是根据数据的长度来显示数 ...

随机推荐

  1. ubuntu 选择最快得源

    root权限.新版的Ubuntu(12.04)已经不再自带类似apt-spy之类的选择最快的源的命令行工具,默认的源经常那个龟速啊……手动测试哪个源在当前网络环境下会比较快还是比较累的,这里整理一个脚 ...

  2. css filter详解

    css filter详解 filter 属性详解 属性 名称 类型 说明 grayscale 灰度 值为数值 取值范围从0到1的小数(包括0和1) sepia 褐色 值为数值 取值范围从0到1的小数( ...

  3. [BZOJ 1733] [Usaco2005 feb] Secret Milking Machine 【二分 + 最大流】

    题目链接:BZOJ - 1733 题目分析 直接二分这个最大边的边权,然后用最大流判断是否可以有 T 的流量. 代码 #include <iostream> #include <cs ...

  4. 严重推荐一个免费开源数据库建模工具软件 --OpenSystemArchitect 4.0

    嘿嘿,对于我这样的新手,这个工具还是很令人兴奋的. 真的是术业有专攻啊.关键还是免费开源 EXCEL,VISO,PPT,PS,CD,FREEHAND不是不可以,只是.人家还是专业点,方便点.. Ope ...

  5. Git的分支与合并

    在Git里面我们可以创建不同的分支,来进行调试.发布.维护等不同工作,而互不干扰.下面我们还是来创建一个试验仓库,看一下Git分支运作的台前幕后: $rm -rf test_branch_proj $ ...

  6. SQLite: sqlite_master

    SQLite数据库中一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有表的索引.每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表, 它定义数据库的 ...

  7. Delphi安装/卸载OCX控件的方法

    delphi  安装卸载ocx 请参见 如下 http://blog.csdn.net/xt_chaoji/article/details/7027298 打开Delphi,关闭所有项目. 1.    ...

  8. n个灯,k个人的开灯问题

    /**有n个灯,编号为1-n.第一个人把所以灯打开,第二个人按下 所有编号为2的倍数的开关,第三个人按下3的倍数的开关,依次类推, 一共有k个人,问最后有哪些灯开着? 样例输入: 7 3 样例输出: ...

  9. Windbg扩展的一些参考文章

    Windbg脚本和扩展工具开篇http://www.cnblogs.com/pugang/archive/2012/11/30/2796617.html WinDbg简单扩展DLL http://ww ...

  10. OpenStack Havana 部署在Ubuntu 12.04 Server 【OVS+GRE】(二)——网络节点的安装

    序:OpenStack Havana 部署在Ubuntu 12.04 Server [OVS+GRE] 网络节点: 1.安装前更新系统 安装好ubuntu 12.04 Server 64bits后,进 ...