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. WPFDispatcher示例

    Dispatcher 类提供用于管理线程工作项队列的服务. 效果演示: <Window x:Class="WPF之Dispatcher对象.MainWindow" xmlns ...

  2. C语言的指针

    指针是C语言中非常重要的数据类型,那么什么是指针呢? 指针类型就是用来用来存放变量地址的变量,指向某个变量. 指针的一般形式:*指针变量名 int *p; float *p1; “*”是用来说明这个变 ...

  3. 2016022605 - redis订阅发布

    Redis的实现消息队列功能,消息发布者发送的消息,消息接收者接收发布者的消息.由该消息传送的链路被称为通道.在Redis客户端可以订阅任何数目的通道. 案例:给出一个客户端订阅一个通道名为redis ...

  4. Ipv6_Only-b

    网上好多关于ipv6的资料,说半天ipv6是什么,怎么建立测试环境,,,可是没有看到具体的操作和解决的方案,这里,为大家提供一种方案,希望给大家带来帮助吧. 总的来说有三个方面需要进行检查和修改: 1 ...

  5. LightOj_1274 Beating the Dataset

    题目链接 题意: 给一个文档, 这个文档由yes .no 组成, 共有s个byte, 共有n个yes.no. 假设yes的个数为yes_num, no的个数为no_num. 将这n个数进行排列, 对于 ...

  6. MySQL创建用户、授权等

    用于MySQL5.6命令行执行成功: create database wp_people; create user wp_people@'localhost' identified by 'yrwb' ...

  7. ruby定时脚本

    ruby定时脚本的实现涉及到三个方面: 要定时执行的代码 定时控制(设置定时的时间) 将脚本后台化 实例: # in func.rb def func # the function body goes ...

  8. Web Scale IT 与 6 种 DevOps 工具

    新年伊始,在总结过去一年 IT 行业变化和发展的同时,不少企业更关注未来一年甚至几年的行业趋势.Gartner 于 2014 年发表了文章 Gartner Says By 2017 Web-Scale ...

  9. Java System类看到的一点小记

    System类 位置java.lang包中 是final类,不能被继承,不能被修改 ,不能被实例化 private System(){}私有的构造函数,不允许被其他对象进行实例化 public fin ...

  10. Linux Eclipse代码提示功能设置(Java & C/C++)

    最近在Linux下开发,由于长期使用Visual Studio 2010,对代码提示功能情有独钟,现在在Linux下,使用Eclipse做开发,当然免不了怀念Visual Studio强悍的代码提示, ...