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

MainActivity.java

package com.sxt.day05_10;

import java.util.ArrayList;
import java.util.List; import com.sxt.day05_10.entity.ContactBean; import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
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 { //MVC
ListView mlvContact;
List<ContactBean> mContacts;
ContactAdapter mAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
} private void initView() {
mlvContact=(ListView) findViewById(R.id.lvContact);
mAdapter=new ContactAdapter(mContacts, this);//这里通过构造器将数据穿进去,好处是低耦合,内部类和外部类仅仅通过构造器进行数据的传递,没有别的地方有关联。以后将内部类提取出去成外部类的时候修改的代码量会少。
mlvContact.setAdapter(mAdapter);
} private void initData() {
String[] names=getResources().getStringArray(R.array.names);//字符串数组资源
String[] phones=getResources().getStringArray(R.array.phones);
mContacts=new ArrayList<ContactBean>();
for (int i = 0; i < phones.length; i++) {
ContactBean contact=new ContactBean(names[i], phones[i]);
mContacts.add(contact);
}
} class ContactAdapter extends BaseAdapter{
List<ContactBean> contacts;
MainActivity context; public ContactAdapter(List<ContactBean> contacts, MainActivity context) {
super();
this.contacts = contacts;
this.context = context;
} @Override
public int getCount() {
return contacts.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
//convertView是一个缓存,缓存一屏幕数量的列表项,缓存是一个convertView缓存一个holder,一个hoder就是一条数据
Log.i("main","position="+position);//如果一屏幕有10条,则第一屏getView函数调用10次,分别打印0-9,
ViewHolder holder=null;
if(convertView==null){//第一屏中没有返回那个layout所以convertView这个缓存为null,因为是新的所以convertView和holder都要重新创建并把holder加入convertView中,
convertView=View.inflate(context, R.layout.item_contact, null);//将资源文件item_contact.xml创建出来
holder=new ViewHolder();
holder.tvName=(TextView) convertView.findViewById(R.id.tvName);
holder.tvPhone=(TextView) convertView.findViewById(R.id.tvPhone);
convertView.setTag(holder);//tag属性是View类的属性,是Object类型,现在convertView里面有了一屏幕数量的列表项数据了(一个convertView缓存一个holder)。
}else{//以后的滚动,出现其他的列表项,直接从缓存中取出来(旧的布局,convertView和holder已经存在了并且已经加入进去了,但是数据还是要重新设置进去)
holder=(ViewHolder) convertView.getTag();
}
//新的数据出现在屏幕的时候调用
ContactBean contact=contacts.get(position);
holder.tvName.setText(contact.getName());
holder.tvPhone.setText(contact.getPhone());
return convertView;//系统根据convertView进行显示
} class ViewHolder{
TextView tvName,tvPhone;
}
}
}

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ListView
android:id="@+id/lvContact"
android:layout_width="match_parent"
android:layout_height="match_parent" layout_height和layout_width都要设置成match_parent,否则不能利用缓存机制
android:divider="#ccc"
android:dividerHeight="10dp"/> </RelativeLayout>
item_contact.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" > <TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="张飞"/>
<TextView
android:id="@+id/tvPhone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="13577889966"
android:layout_marginLeft="10dp"
android:textSize="20sp"/> </LinearLayout>

ContactBean.java

public class ContactBean {

    private String name;
private String phone;
public String getName() {
return name;
}

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. [CSS]cursor鼠标样式

     用css控制鼠标样式的语法如下: <span style="cursor:*">文本或其它页面元素</span>  把 * 换成如下15个效果的一种:   ...

  2. 关于python decode()和 encode()

    1.先收集一下这几天看到的关于decode()解码和encode()编码的用法 bytes和str是字节包和字符串,python3中会区分bytes和str,不会混用这两个.字符串可以编码成字节包,而 ...

  3. python运维开发之第二天

    一.模块初识: 1.模块定义 python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某 ...

  4. C语言的预处理命令

    C语言编译器处理时经过的第一个步骤是预处理,就是从.c文件处理为.i文件.在预处理时编译器做了一些展开替换的处理. 1>头文件展开,即将#include "stdio.h"类 ...

  5. 练习2 J题 - 多项式求和

      Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description 多项式 ...

  6. cygwin使用

    Cygwin是一个在windows平台上运行的类UNIX模拟环境,是cygnus solutions公司开发的自由软件(该公司开发的著名工具还有eCos,不过现已被Redhat收购). 它对于学习UN ...

  7. Eclipse 项目有红感叹号、小红叉

    红感叹号: 问题原因]:工程中classpath中指向的包路径错误 [解决办法]:右键项目名称 BuildPath ---> Configure Build Paht...中,然后上面有几个选项 ...

  8. android 判断程序是首次(第一次)进入

    很多时候,我们需要判断用户是不是第一次进入程序,以决定是不是给用户一些操作提示. 这种功能的实现,说到底还是将数据(一个标志位)存储起来,下次进入程序的时候读取数据进行判断. 我这里只给出一种较简单的 ...

  9. NOIP2014酱油记

    尘埃落定,来补一下酱油记吧... day-1 晚上老师说有xyz的noip模拟赛,于是果断请假来做(shou)题(nve),题目真是理(S)性(X)愉(B)悦(K),然后就爆零了!感觉noip要爆零滚 ...

  10. Matlab与DSP联合开发

    1.关于DSP开发环境 刚开始接触TI CCS的时候,用的是CCS2.2,当时CCS2.2又分成4个系列安装包 1.CCS6000 2.CCS5000 3.CCS2000 4.OMAP 都可以单独安装 ...