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

 

posted @ 2015-10-17 22:05  无天666  阅读(232)  评论(0编辑  收藏  举报