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 ...
随机推荐
- C# 基础(8)--网络编程
套接字,客户端连接服务器,作为进程通讯机制,是基于描述IP地址和端口,是一个通讯链的句柄,其实质就是两个程序通讯用的. 非常类似于电话插座.双方通话的过程,是一方向电话机发出信号和对方从电话机接受信号 ...
- HTML5中判断横屏竖屏
在移动端中我们经常碰到横屏竖屏的问题,那么我们应该如何去判断或者针对横屏.竖屏来写不同的代码呢. 这里有两种方法: 一:CSS判断横屏竖屏 写在同一个CSS中 1 2 3 4 5 6 @media s ...
- redis客户端连接异常
本文参考:http://mdba.cn/2015/04/02/redistwemproxy-%e5%ae%a2%e6%88%b7%e7%ab%af%e8%bf%9e%e6%8e%a5%e5%bc%82 ...
- JavaScript-永远点不到的小窗口
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- 好文推荐系列---------JS模板引擎
这篇文章写的很清晰,不再赘述,直接上链接:http://www.tuicool.com/articles/aiaqMn
- 命令安装VS
Installing Visual Studio Visual Studio 2015 Other Versions Visual Studio 2013 Visual Studio 2010 ...
- [转]linux shell数据重定向(输入重定向与输出重定向)详细分析
在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件 ...
- 简单的比大小 shell 脚本和ping
#!/bin/bash echo "输入第一个数字"read Aecho "输入第二个数字"read B if [ $A -gt $B ] thenecho & ...
- CentOS 7 安装 vmware-tools
[原创]标题:<CentOS 7 安装 vmware-tools>:作者:肖雪峰,QQ:35360657. 用 VMware Workstation 11 新安装了CentOS 7虚拟机, ...
- Teamcenter 2007 "由于某些意外的 DBMS 错误失败"
PLM系统实施过程中经常需要做整个系统的克隆备份.Teamcenter2007在做基于Oracel的系统克隆时,用exp功能导出数据表,部署在目标机器上时会遇到DBMS错误,导致后续DB写操作无法进行 ...