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;
}