ListView介绍
安卓中ListView是一种自定义清单表,我们经常在淘宝上搜索宝贝后所出现的上下可滑动的商品列表、QQ/微信消息列表等都是ListView控件来做的,下面红框框中就是ListView。
有没有一种豁然开朗的感觉(疯狂暗示)。。。所以掌握ListView这种控件的使用方法对Android开发是非常有用的。从QQ消息清单中,每一个QQ好友列表就是ListView中的一个元素,每一行中我们发现有图像、Id、消息、时间,这些就是ListView的每一个元素的组成部分,所以ListView还是比较强大的 ,它可以自定义各种风格,只有你想不到,没有它做不到。
ListView使用原理
1. 建立自定义ListView显示样式layout_xml
2. 在Activity对应的XML中,拖入ListView,并设置ID
3. 在Activity中利用Java代码操作实现,适配器原理
An Adapter object acts as a bridge between an AdapterView
and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View
for each item in the data set.(摘自Android官网)
什么是数据适配器?
下图展示了数据源、适配器、ListView等数据展示控件之间的关系。我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的。数据适配器正是建立了数据源与ListView之间的适配关系,将数据源转换为ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,降低程序的耦合性。这也体现了Android的适配器模式的使用。对于ListView、GridView等数据展示控件有多种数据适配器,本文讲解最通用的数据适配器——BaseAdapter。
. ListView的显示与缓存机制
我们知道,ListView、GridView等控件可以展示大量的数据信息。假如下图中的ListView可以展示100条信息,但是屏幕的尺寸是有限的,一屏幕只能显示下图中的7条。当向上滑动ListView的时候,item1被滑出了屏幕区域,那么系统就会将item1回收到Recycler中,即View缓冲池中,而将要显示的item8则会从缓存池中取出布局文件,并重新设置好item8需要显示的数据,并放入需要显示的位置。这就是ListView的缓冲机制,总结起来就是一句话:需要时才显示,显示完就被会收到缓存。ListView,GridView等数据显示控件通过这种缓存机制可以极大的节省系统资源。
.BaseAdapter
使用BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:
public int getCount(): 适配器中数据集的数据个数;
public Object getItem(int position): 获取数据集中与索引对应的数据项;
public long getItemId(int position): 获取指定行对应的ID;
public View getView(int position,View convertView,ViewGroup parent): 获取没一行Item的显示内容。
实战操作ListView
实战说明:创建一个简易学生信息(包含性别、姓名、序号信息)
实战方法如下:
1.创建一个layout xml 并布局完善id
2.在主XML中添加一个ListView控件和部分按钮,布局完善id
3.代码部分解读:
创建Student信息类
//自定义Student类
private class Student
{
String name;
boolean sex;
int id;
public Student(String name,boolean sex,int id)
{
this.name=name;
this.sex=sex;
this.id=id;
}
}
定义适配器
//定义adapter
private class MyListAdapter extends BaseAdapter
{
// 男女图标
Drawable[] icons = new Drawable[2];
public MyListAdapter()
{
icons[0] = MainActivity.this.getDrawable(R.drawable.ic_female);
icons[1] = getDrawable(R.drawable.ic_male);
}
@Override
public int getCount()
{
// 一共多少项
return listData.size();
}
@Override
public Object getItem(int position)
{
// 获取每一项的数据
return listData.get(position);
}
@Override
public long getItemId(int position)
{
// 获取某项对应的内部ID, 如果不需要,则直接把position作为ID
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
// 创建控件
if (convertView == null)
{
//将自定义layout xml(list_item_student)添加给convertView
convertView = getLayoutInflater()
.inflate(R.layout.list_item_student, parent, false);
}
// 获取数据
Student data = (Student) getItem(position);
// 显示数据
TextView textView = (TextView) convertView.findViewById(R.id.id_textview);
textView.setText(data.name+"("+data.id+")");
ImageView imageView = (ImageView)convertView.findViewById(R.id.id_imageview);
if (data.sex)
imageView.setImageDrawable(icons[1]);
else
imageView.setImageDrawable(icons[0]);
return convertView;
}
}
使用adapter
//Activity主页中
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 准备数据
listData.add(new Student("小张", true));
listData.add(new Student("小王", false));
listData.add(new Student("小李", true));
//准备适配器
MyListAdapter adapter=new MyListAdapter();
//添加adapter
ListView listview=(ListView)findViewById(R.id.id_listView);
listview.setAdapter(adapter);
}
效果图显示
展示的效果图另外还添加了一些功能,但是基本的框架跟以上介绍的是一样的。想要这个原码的可以私聊我哟(免费滴嘛)
谢谢观看,欢迎评论(如有不对,及时指教)