android 34 ListView进阶
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; }