1、在android开发中ListView是比较常用的组件,它以列表的形式垂直展示具
体内容,并且能够根据数据的长度自适应显示
2、ListView继承关系
java.lang.Object
--android.view.View
--android.view.ViewGroup
--android.widget.AdapterView<T extends android.widget.Adapter>
--android.widget.AbsListView
--android.widget.ListView
3、ListView基本结构
header
item
footer
4、ListView的数据显示需要三个要素
ListVeiw :用来展示列表的View
适配器(Adapter) :用来把数据映射到ListView上
ArrayAdapter(功能很简单只能显示文字)
SimpleAdapter
BaseAdapter
数据 :具体的将被映射的字符串,图片,或者基本组件
5、ListView+Adapter使用步骤
1)创建或获取ListView
2)创建Adapter
比如ArrayAdapter
列表项(Item)布局可以使用Android平台内置的layout
android.R.layout.simple_list_item_1
也可以自定义一个layout
3)调用setAdapter将ListView和Adapter关联
android.widget.ListView.setAdapter(ListAdapter adapter)
<?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" >
<ListView
android:id="@+id/listView_info"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView>
</LinearLayout>
列表中一个项目的布局文件call_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingTop="10dp"
>
<TextView
android:id="@+id/call_item_tv_familyname"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@android:color/holo_blue_bright"
android:gravity="center"
android:text="周"
/>
<LinearLayout
android:id="@+id/call_item_ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="5dp"
android:layout_toRightOf="@id/call_item_tv_familyname"
>
<TextView
android:id="@+id/call_item_tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:text="周游"
/>
<TextView
android:id="@+id/call_item_tv_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:text="1234567778"
/>
</LinearLayout>
</RelativeLayout>
package com.hngde.listviewdemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import com.domain.User2;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
CallMainActivity.java(利用SimpleAdapter适配器实现)
public class CallMainActivity extends Activity {
private ListView listView_info;
private List<Map<String,String>> user2List;
public CallMainActivity(){
user2List = new ArrayList<Map<String,String>>();
Map<String,String> map1 = new HashMap<String,String>();
map1.put("familyName","周");
map1.put("name", "周游");
map1.put("phone","18273301805");
Map<String,String> map2 = new HashMap<String,String>();
map2.put("familyName","杨");
map2.put("name", "杨明");
map2.put("phone","18271601805");
Map<String,String> map3 = new HashMap<String,String>();
map3.put("familyName","应");
map3.put("name", "应以正");
map3.put("phone","16273301609");
user2List.add(map1);
user2List.add(map2);
user2List.add(map3);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview_layout);
listView_info = (ListView) this.findViewById(R.id.listView_info);
//创建适配器
SimpleAdapter sa = new SimpleAdapter(
this, //传入当前的Activity
user2List, //这是一个装入了map的集合,其中存储了我们要显示的数据
R.layout.call_item, //这是ListView每个项目的布局文件
new String[]{"familyName","name","phone"}, //这里是map中的键,是用来获取map中的值的
new int[]{R.id.call_item_tv_familyname, //这是map中的值将要放入的组件
R.id.call_item_tv_name,
R.id.call_item_tv_phone}
);
//设置页面标题
this.getActionBar().setTitle("通讯记录");
listView_info.setAdapter(sa);
}
SimpleAdapter显示的信息多,但不够灵活,BaseAdapter可以解决所有问题
BaseAdapter抽象类,作为自定义Adapter的父类
开发中大部分情况下都得使用BaseAdapter类作为适配器
CallMainActivity.java(利用BaseAdapter适配器实现)
package com.hngde.listviewdemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import com.domain.User2;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class CallMainActivity extends Activity {
private ListView listView_info;
private List<User2> user2List;
//用来随机改变姓氏上面的颜色
private int[] colorId = new int[]{
Color.BLUE,
Color.CYAN,
Color.RED,
Color.GREEN,
Color.YELLOW
};
public CallMainActivity(){
user2List = new ArrayList<User2>();
User2 user1 = new User2("周","周游","18273301805");
User2 user2 = new User2("周","周游","18273301805");
User2 user3 = new User2("周","周游","18273301805");
User2 user4 = new User2("周","周游","18273301805");
User2 user5 = new User2("周","周游","18273301805");
User2 user6 = new User2("周","周游","18273301805");
user2List.add(user1);
user2List.add(user2);
user2List.add(user3);
user2List.add(user4);
user2List.add(user5);
user2List.add(user6);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview_layout);
listView_info = (ListView) this.findViewById(R.id.listView_info);
//添加适配器
listView_info.setAdapter(new CallAdapter(this));
this.getActionBar().setTitle("通讯记录");
}
//产生一个0-5之间的随机数
public int getRandomNum(){
Random random = new Random();
int n = Math.abs(random.nextInt());
return n%5;
}
class CallAdapter extends BaseAdapter{
private Context context;
public CallAdapter(Context context){
this.context = context;
}
@Override
public int getCount() {
return user2List.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View arg1, ViewGroup arg2) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
View v = layoutInflater.inflate(R.layout.call_item, null);
TextView call_item_tv_familyname = (TextView) v.findViewById(R.id.call_item_tv_familyname);
TextView call_item_tv_name = (TextView) v.findViewById(R.id.call_item_tv_name);
TextView call_item_tv_phone = (TextView) v.findViewById(R.id.call_item_tv_phone);
User2 user = user2List.get(position);
call_item_tv_familyname.setText(user.getFamilyName());
call_item_tv_name.setText(user.getName());
call_item_tv_phone.setText(user.getPhone());
call_item_tv_familyname.setBackgroundColor(colorId[getRandomNum()]);
return v;
}
}
}
体内容,并且能够根据数据的长度自适应显示
2、ListView继承关系
java.lang.Object
--android.view.View
--android.view.ViewGroup
--android.widget.AdapterView<T extends android.widget.Adapter>
--android.widget.AbsListView
--android.widget.ListView
3、ListView基本结构
header
item
footer
4、ListView的数据显示需要三个要素
ListVeiw :用来展示列表的View
适配器(Adapter) :用来把数据映射到ListView上
ArrayAdapter(功能很简单只能显示文字)
SimpleAdapter
BaseAdapter
数据 :具体的将被映射的字符串,图片,或者基本组件
5、ListView+Adapter使用步骤
1)创建或获取ListView
2)创建Adapter
比如ArrayAdapter
列表项(Item)布局可以使用Android平台内置的layout
android.R.layout.simple_list_item_1
也可以自定义一个layout
3)调用setAdapter将ListView和Adapter关联
android.widget.ListView.setAdapter(ListAdapter adapter)
6、案例-显示姓名信息
效果图
<?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" >
<ListView
android:id="@+id/listView_info"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView>
</LinearLayout>
列表中一个项目的布局文件call_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingTop="10dp"
>
<TextView
android:id="@+id/call_item_tv_familyname"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@android:color/holo_blue_bright"
android:gravity="center"
android:text="周"
/>
<LinearLayout
android:id="@+id/call_item_ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="5dp"
android:layout_toRightOf="@id/call_item_tv_familyname"
>
<TextView
android:id="@+id/call_item_tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:text="周游"
/>
<TextView
android:id="@+id/call_item_tv_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:text="1234567778"
/>
</LinearLayout>
</RelativeLayout>
package com.hngde.listviewdemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import com.domain.User2;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
CallMainActivity.java(利用SimpleAdapter适配器实现)
public class CallMainActivity extends Activity {
private ListView listView_info;
private List<Map<String,String>> user2List;
public CallMainActivity(){
user2List = new ArrayList<Map<String,String>>();
Map<String,String> map1 = new HashMap<String,String>();
map1.put("familyName","周");
map1.put("name", "周游");
map1.put("phone","18273301805");
Map<String,String> map2 = new HashMap<String,String>();
map2.put("familyName","杨");
map2.put("name", "杨明");
map2.put("phone","18271601805");
Map<String,String> map3 = new HashMap<String,String>();
map3.put("familyName","应");
map3.put("name", "应以正");
map3.put("phone","16273301609");
user2List.add(map1);
user2List.add(map2);
user2List.add(map3);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview_layout);
listView_info = (ListView) this.findViewById(R.id.listView_info);
//创建适配器
SimpleAdapter sa = new SimpleAdapter(
this, //传入当前的Activity
user2List, //这是一个装入了map的集合,其中存储了我们要显示的数据
R.layout.call_item, //这是ListView每个项目的布局文件
new String[]{"familyName","name","phone"}, //这里是map中的键,是用来获取map中的值的
new int[]{R.id.call_item_tv_familyname, //这是map中的值将要放入的组件
R.id.call_item_tv_name,
R.id.call_item_tv_phone}
);
//设置页面标题
this.getActionBar().setTitle("通讯记录");
listView_info.setAdapter(sa);
}
}
关于SimpleAdapter的说明
SimpleAdapter显示的信息多,但不够灵活,BaseAdapter可以解决所有问题
BaseAdapter抽象类,作为自定义Adapter的父类
开发中大部分情况下都得使用BaseAdapter类作为适配器
CallMainActivity.java(利用BaseAdapter适配器实现)
package com.hngde.listviewdemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import com.domain.User2;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class CallMainActivity extends Activity {
private ListView listView_info;
private List<User2> user2List;
//用来随机改变姓氏上面的颜色
private int[] colorId = new int[]{
Color.BLUE,
Color.CYAN,
Color.RED,
Color.GREEN,
Color.YELLOW
};
public CallMainActivity(){
user2List = new ArrayList<User2>();
User2 user1 = new User2("周","周游","18273301805");
User2 user2 = new User2("周","周游","18273301805");
User2 user3 = new User2("周","周游","18273301805");
User2 user4 = new User2("周","周游","18273301805");
User2 user5 = new User2("周","周游","18273301805");
User2 user6 = new User2("周","周游","18273301805");
user2List.add(user1);
user2List.add(user2);
user2List.add(user3);
user2List.add(user4);
user2List.add(user5);
user2List.add(user6);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview_layout);
listView_info = (ListView) this.findViewById(R.id.listView_info);
//添加适配器
listView_info.setAdapter(new CallAdapter(this));
this.getActionBar().setTitle("通讯记录");
}
//产生一个0-5之间的随机数
public int getRandomNum(){
Random random = new Random();
int n = Math.abs(random.nextInt());
return n%5;
}
class CallAdapter extends BaseAdapter{
private Context context;
public CallAdapter(Context context){
this.context = context;
}
@Override
public int getCount() {
return user2List.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View arg1, ViewGroup arg2) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
View v = layoutInflater.inflate(R.layout.call_item, null);
TextView call_item_tv_familyname = (TextView) v.findViewById(R.id.call_item_tv_familyname);
TextView call_item_tv_name = (TextView) v.findViewById(R.id.call_item_tv_name);
TextView call_item_tv_phone = (TextView) v.findViewById(R.id.call_item_tv_phone);
User2 user = user2List.get(position);
call_item_tv_familyname.setText(user.getFamilyName());
call_item_tv_name.setText(user.getName());
call_item_tv_phone.setText(user.getPhone());
call_item_tv_familyname.setBackgroundColor(colorId[getRandomNum()]);
return v;
}
}
}