android 中listview之BaseAdapter的使用
Listview控件不像其他安卓控件那种直接拖拽到界面上就能用,而是采用类似J2EE中的MVC模型的方式使用,需要通过适配器将某种样式的数据或控件添加到其上而使用.
MVC模型实现原理是 数据模型M(Model) 存放数据,利用控制器C (Controller)将数据显示在视图V (View)上。
利用BaseAdapter实现一个ListView的步骤一般如下:
1 首先准备好需要显示在LiseView中的数据 ——List
2 然后编写2 个XML 文件 第一个文件是ListView控件所在的布局文件 第二个文件是ListVIew中每一个item的布局文件
3 创建一个继承自BaseAdapter的类
4 为ListView绑定适配器 setAdapter(继承BaseAdapter 类的实例)
5 用传统方式来覆写适配器的getView函数和getCount 函数(从参数convertView里映射布局文件,find各个控件填充数据)
6 加入ViewHolder类(定义n个控件的声明)用convertView.setTag(viewHolder)在View和Object之间关联,此目的是节省find多次的时间。
步骤一 List的使用
数据源可以有多种形式,比如是一个数组,或者是一个list 其作用是使lisview中每一行显示出数据源的每一个元素的值。
比如ListView中每一个item只有一个控件 TextView 则list可以定义成一个字符串数组,或者一个ArrayList 。
如果ListView中每一个item有很多个控件,则可以把多个控件的值类型定义成一个类如Item类 格式如下
public class Item{
String name;
String text;
int number;
int imageId;
//省略setter和getter方法
}
则此时List定义成List 并且初始化为
List<Item> listItems = new ArrayList<>();
并赋予值如下
for(int i = 0 ; i < 10 ; i ++){
Item item = new Item();
item.setName("sqf");
item.setText("Hello World");
item.setNumber(i);
item.setImageId( R.drawable.ic_launcher);
listItems.add(item);
}
或者将多个控件的值的类型包装成Map ,改成如下格式:
List<Map<String , Object>> listItems = new ArrayList<Map<String , Object>>();
Map<String, Object> map;
for(int i=0;i<10;i++)
{
map = new HashMap<String, Object>();
map.put("imageId", R.drawable.ic_launcher);
map.put("text", "hello World");
map.put("name" , "sqf");
map.put("number", i);
listItems.add(map);
}
此时list已经构建完毕,已经得到了需要加入ListView中的值了。
步骤二 编写需要ListView布局文件以及ListView中item的布局文件
ListView布局文件的例子如下:
activity所在的布局XML中只需要含有listview的控件,listview中每一行的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">
<ListView android:id="@+id/list_view"
android:layout_height="match_parent"
android:layout_width="match_parent">
</ListView>
</LinearLayout>
ListView的Item的布局文件
<?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">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
android:gravity="center_horizontal"
android:textSize="20dp"/>
</LinearLayout>
步骤三 创建一个继承自BaseAdapter的类
例子如下所示:
private class ExampleAdapter extends BaseAdapter{
private LayoutInflater mInflater = null;
private ExampleAdapter(Context context){
this.mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return listItems.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return null;
}
}
这里主要需要重写的方法有getcount 和getView 因为在绘制listview的时候需要多次调用getcount方法和getView方法。这里getCount的返回值就是第一步里面定义的listItems大小。同时在这个类里定一个成员变量mInflater和一个构造方法。
layoutInflater的作用
LayoutInflater的作用类似于findviewById() .不同在于LayoutInflater是用来找res/layout下的xml布局文件,并且实例化。
具体作用如下:1 对于一个没有载入或者想要动态载入的界面,都需要使用Layoutinflater.inflater() 来载入。
2 对于已经载入的界面,就可以使用Activity.findViewById()方法来获取其中的界面元素。
获得layoutInflater实例的三种方式
1 layoutinflater inflater = getLayoutInflater();
2 LayoutInflater localinflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
3 LayoutInflater inflater = LayoutInflater.from(context)
这三种的本质都是调用context.getSystemService()
获得实例之后可以通过实例调用该类的方法inflate 这个方法有一下几种的过载形式,返回值均为View对象.
public View inflate (int resource, ViewGroup root)
public View inflate (XmlPullParser parser, ViewGroup root)
public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)
public View inflate (int resource, ViewGroup root, boolean attachToRoot)
示例代码如下:
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
//下面第二个参数可以为Null
View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));
//EditText editText = (EditText)findViewById(R.id.content);// error
EditText editText = (EditText)view.findViewById(R.id.content);
步骤四 为ListView 绑定适配器
首先实例化自定义的Adapter,然后找到listview视图的对象,用setAdapter方法为ListVIew绑定适配器。
例子如下:
private ListView listview;
private ExampleAdapter adapter = new ExampleAdapter();
listview.setAdapter(adapter);
步骤五 六 覆盖getView方法
View getView():返回列表项对应的视图,方法体中
1 ◆实例化视图填充器
2 ◆用视图填充器,根据Xml文件,实例化视图
3 ◆根据布局找到控件,并设置属性
4 ◆返回View视图
实例如下:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = new ViewHolder();
if(convertView == null){
convertView = mInflater.inflate(R.layout.item_list_view,null);
viewHolder.textView = (TextView)convertView.findViewById(R.id.list_view_text);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.textView.setText(listItems.get(position));
return convertView;
}
private class ViewHolder{
TextView textView;
}
这里调用自带的convertview ,如果缓存为空 将LayoutInflater的实例赋给convertview,convertview用来存储加载布局(listview的item 的layout)的layout.xml,同时在讲加载布局内的findViewById的值放到viewHoler中。如果convertview不为空,则将findviewById的值取出来。这里就完成了实例化视图以及根据布局查找控件。接下里将存储数据的listItems来给view中的控件设置属性。最后返回view视图。
android 中listview之BaseAdapter的使用的更多相关文章
- Android中ListView通过BaseAdapter实现数据的绑定
1. public class ListFiles extends Activity { ListView Listview=null; protected void onCreate(Bundle ...
- Android中ListView控件的使用
Android中ListView控件的使用 ListView展示数据的原理 在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet ...
- Android中Listview点击item不变颜色以及设置listselector 无效
Android中Listview点击item不变颜色以及设置listselector 无效 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listsele ...
- android中ListView控件&&onItemClick事件中获取listView传递的数据
http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...
- android中ListView点击和里边按钮点击不能同时生效问题解决
今天遇到一个问题:android中ListView点击和里边button点击不能同时生效问题解决. 原因是: listView 在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得 ...
- Android中ListView无法点击
Android中ListView无法点击 转自:http://xqjay19910131-yahoo-cn.iteye.com/blog/1319502 问题描述: ListView中Item加入 ...
- Android 中万能的 BaseAdapter(Spinner,ListView,GridView) 的使用!
大家好!今天给大家讲解一下BaseAdapter(基础适配器)的用法,适配器的作用主要是用来给诸如(Spinner,ListView,GridView)来填充数据的.而(Spinner,ListVie ...
- Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)
昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...
- Android中ListView的几种常见的优化方法
Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...
随机推荐
- 【Mail】JavaMail介绍及发送邮件(一)
JavaMail介绍 JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP.POP3.IMAP,开发人员使用JavaMail ...
- 大前端学习笔记整理【一】CSS盒模型与基于盒模型的6种元素居中方案
概览 CSS盒模型,规定了元素框来处理元素的 内容.内边距.边框和外边距的方式 元素部分是指内容部分,也是最实际的内容,包围内容的称之为内边距,内边距外围是边框,边框外围就是外边距:且外边距是透明的, ...
- php 使用 极光推送 类
<?php /** * 安卓和苹果消息主推 */ class JPush extends CComponent { private $_push_body = array(); private ...
- js库收集
------图表 中文 http://www.highcharts.me/ 英文 http://www.highcharts.com/ ------web前端开发框架 中文 http://www.bo ...
- js 常见混乱
slice(begin.end) 复制出一个新的数组或是一个新的字符串,其中end 不包括end本身 splice(begin,howmany,item1....itemn) 更改原先的array 会 ...
- Android Service完全解析,关于服务你所需知道的一切(上)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...
- SharePoint 2013异常信息的查看
刚刚学习SharePoint开发的时候,经常遇到一些异常,却不能直接看到详细信息,很郁闷.这里做下简单的整理,方便查找: 1.代码未处理异常出现黄页——”‘/’应用程序中的服务器错误.运行时错误“. ...
- LoopbackJS 生成对应 Oracle 视图的model
StrongLoop Arc 工具中的discover model 目前只能discover 表, Oracle数据库中的视图经测试并不能显示在列表中. 无奈之下,暂时只能采取替代方案. 解决方法: ...
- vs2010编辑器中找不到System.Web.Extensions.dll
vs2010编辑器中想添加System.Web.Extensions.dll引用,却发现引用不了: 排除办法: 1.找到自己VS2010中System.Web.Extensions.dll的所在位置, ...
- Java 第29章GUI
GUI入门 JDBC 连接数据库的过程 注册驱动(class ,forName) 创建连接 创建连接对象 执行SQL语句 statement对象的类型与作用 1.(layout :版面,布局) 2.( ...