您的位置:首页 > 其它

列表视图案例3——显示联系人

2018-03-06 11:28 351 查看
列表视图案例3——显示联系人
一、运行效果


二、实现步骤1、新建安卓应用DisplayContacts


2、准备背景图片background.jpg


3、主布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="15dp"
android:background="@mipmap/background"
tools:context="net.hw.display_contacts.MainActivity">

<ListView
android:id="@+id/lv_contact"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>

</LinearLayout>4、创建联系人列表项模板contact_list_item.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="vertical"
android:padding="10dp">

<TextView
android:id="@+id/tv_contact_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#0000ff"
android:textSize="20sp" />

<TextView
android:id="@+id/tv_contact_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="25dp"
android:textColor="#555555"
android:textSize="16sp" />

</LinearLayout>5、修改字符串资源文件strings.xml

<resources>
<string name="app_name">显示联系人(采用基适配器)</string>
</resources>6、 创建联系人实体类Contact

package net.hw.display_contacts;

/**
* Created by howard on 2017/11/13.
*/

public class Contact {
private String name;
private String phone;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

@Override
public String toString() {
return "Contact{" +
"name='" + name + '\'' +
", phone='" + phone + '\'' +
'}';
}
}7、创建联系人适配器ContactAdapter

package net.hw.display_contacts;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

/**
* Created by howard on 2017/11/13.
*/

public class ContactAdapter extends BaseAdapter {
/**
* 联系人数组
*/
private Contact[] contacts;
/**
* 上下文环境
*/
private Context context;
/**
* 程序标记
*/
private final String TAG = "ContactAdapter";

/**
* 通过构造方法传入联系人数组
*
* @param contacts
* @param context
*/
public ContactAdapter(Context context, Contact[] contacts) {
this.context = context;
this.contacts = contacts;
}

/**
* 获取列表项个数
*/
@Override
public int getCount() {
return contacts.length;
}

/**
* 获取列表项
*/
@Override
public Object getItem(int position) {
return contacts[position];
}

/**
* 获取列表项标识
*/
@Override
public long getItemId(int position) {
return position;
}

/**
* 获取列表项视图
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
// 利用布局填充器将列表项模板转换成视图
convertView = LayoutInflater.from(context).inflate(R.layout.contact_list_item, null);
}

// 输出转换视图的哈希码
Log.d(TAG, "getView.convertView.hashcode: " + convertView.hashCode());

// 从转换视图里获取控件实例
TextView tvContactName = (TextView) convertView.findViewById(R.id.tv_contact_name);
TextView tvContactPhone = (TextView) convertView.findViewById(R.id.tv_contact_phone);

// 输出转换视图里控件的哈希码
Log.d(TAG, "getView.convertView.tvContactName.hashcode: " + tvContactName.hashCode());

// 获取联系人数据
Contact contact = contacts[position];

// 将联系人数据显示在转换视图里
tvContactName.setText(contact.getName());
tvContactPhone.setText(contact.getPhone());

// 返回转换视图
return convertView;
}
}8、主界面类MainActivity

package net.hw.display_contacts;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

/**
* Created by howard on 2017/11/13.
*/
public class MainActivity extends Activity {
/**
* 联系人列表控件
*/
private ListView lvContact;
/**
* 联系人适配器
*/
private ContactAdapter adapter;
/**
* 联系人数组
*/
private Contact[] contacts;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);

// 通过资源标识获得控件实例
lvContact = (ListView) findViewById(R.id.lv_contact);

// 初始化联系人数组(数据源)
contacts = getContacts();

// 创建联系人适配器
adapter = new ContactAdapter(this, contacts);

// 给联系人列表控件设置适配器
lvContact.setAdapter(adapter);
}

/**
* 获取联系人数组
*/
private Contact[] getContacts() {
// 定义联系人数组
Contact[] contacts = new Contact[10];

contacts[0] = new Contact();
contacts[0].setName("凤飞飞");
contacts[0].setPhone("1581212450");

contacts[1] = new Contact();
contacts[1].setName("费翔");
contacts[1].setPhone("1534562350");

contacts[2] = new Contact();
contacts[2].setName("郑智化");
contacts[2].setPhone("1511912450");

contacts[3] = new Contact();
contacts[3].setName("邓丽君");
contacts[3].setPhone("1555656450");

contacts[4] = new Contact();
contacts[4].setName("童安格");
contacts[4].setPhone("1391212000");

contacts[5] = new Contact();
contacts[5].setName("谭咏麟");
contacts[5].setPhone("1591289450");

contacts[6] = new Contact();
contacts[6].setName("张学友");
contacts[6].setPhone("1592323450");

contacts[7] = new Contact();
contacts[7].setName("李克勤");
contacts[7].setPhone("1531256750");

contacts[8] = new Contact();
contacts[8].setName("陈奕迅");
contacts[8].setPhone("1591256750");

contacts[9] = new Contact();
contacts[9].setName("小冬瓜");
contacts[9].setPhone("15923456690");

// 返回联系人数组
return contacts;
}
}9、运行程序,看看效果


打开Android Monitor窗口,看看输出的调试信息:


第一个联系人“凤飞飞”对应的控件的哈希码:109670095
此时,在手机屏幕上向上滑动,显示余下的联系人信息:


此时,看到了“小冬瓜”,但是“凤飞飞”隐藏了。


在手机屏幕上,向下滑动,重新让“凤飞飞”显示出来:


此时,大家可以看到,联系人“凤飞飞”对应控件的哈希码依然是109670095,没有变化。


转换视图里的控件如何已经创建过,就不需要再次创建。为此,我们可以优化代码,提高效率。
10、修改联系人适配器ContactAdapter
package net.hw.display_contacts;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

/**
* Created by howard on 2017/11/13.
*/

public class ContactAdapter extends BaseAdapter {
/**
* 联系人数组
*/
private Contact[] contacts;
/**
* 上下文环境
*/
private Context context;
/**
* 程序标记
*/
private final String TAG = "ContactAdapter";

/**
* 通过构造方法传入联系人数组     *
*/
public ContactAdapter(Context context, Contact[] contacts) {
this.context = context;
this.contacts = contacts;
}

/**
* 获取列表项个数
*/
@Override
public int getCount() {
return contacts.length;
}

/**
* 获取列表项
*/
@Override
public Object getItem(int position) {
return contacts[position];
}

/**
* 获取列表项标识
*/
@Override
public long getItemId(int position) {
return position;
}

/**
* 获取列表项视图
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 声明视图容器
ViewHolder holder;
if (convertView == null) { // 转换视图不存在
// 利用布局填充器将列表项模板转换成视图
convertView = LayoutInflater.from(context).inflate(R.layout.contact_list_item, null);
// 创建视图容器对象
holder = new ViewHolder();
// 实例化视图容器里的控件
holder.tvContactName = (TextView) convertView.findViewById(R.id.tv_contact_name);
holder.tvContactPhone = (TextView) convertView.findViewById(R.id.tv_contact_phone);
// 将视图容器附加到转换视图
convertView.setTag(holder);
} else { // 转换视图已经存在
// 从转化视图里获取视图容器
holder = (ViewHolder) convertView.getTag();
}

// 输出转换视图的哈希码
Log.d(TAG, "getView.convertView.hashcode: " + convertView.hashCode());

// 从视图容器里获取控件对象
TextView tvContactName = holder.tvContactName;
TextView tvContactPhone = holder.tvContactPhone;

// 输出转换视图里控件的哈希码
Log.d(TAG, "getView.convertView.tvContactName.hashcode: " + tvContactName.hashCode());

// 获取联系人数据
Contact contact = contacts[position];

// 将联系人数据显示在转换视图里
tvContactName.setText(contact.getName());
tvContactPhone.setText(contact.getPhone());

// 返回转换视图
return convertView;
}

/**
* 视图容器,包换转换视图里的控件
*/
private static class ViewHolder {
TextView tvContactName;
TextView tvContactPhone;
}
}
11、运行程序,看看结果


三、课后作业利用基适配器完成如下界面:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: