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的使用的更多相关文章

  1. Android中ListView通过BaseAdapter实现数据的绑定

    1. public class ListFiles extends Activity { ListView Listview=null; protected void onCreate(Bundle ...

  2. Android中ListView控件的使用

    Android中ListView控件的使用 ListView展示数据的原理 在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet ...

  3. Android中Listview点击item不变颜色以及设置listselector 无效

    Android中Listview点击item不变颜色以及设置listselector 无效 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listsele ...

  4. android中ListView控件&&onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

  5. android中ListView点击和里边按钮点击不能同时生效问题解决

    今天遇到一个问题:android中ListView点击和里边button点击不能同时生效问题解决. 原因是: listView 在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得 ...

  6. Android中ListView无法点击

    Android中ListView无法点击 转自:http://xqjay19910131-yahoo-cn.iteye.com/blog/1319502   问题描述: ListView中Item加入 ...

  7. Android 中万能的 BaseAdapter(Spinner,ListView,GridView) 的使用!

    大家好!今天给大家讲解一下BaseAdapter(基础适配器)的用法,适配器的作用主要是用来给诸如(Spinner,ListView,GridView)来填充数据的.而(Spinner,ListVie ...

  8. Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)

    昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...

  9. Android中ListView的几种常见的优化方法

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...

随机推荐

  1. Xilinx的约束文件

    FPGA中有三种约束文件,分别是用户设计文件(.ucf文件),网表约束文件(.NCF文件)与物理约束文件(.PCF文件). 在设计阶段,需要硬件描述文件与UCF文件,经过综合后生成NCF文件,最后得到 ...

  2. python第一天基础1-1

    win下是没有多进程的 windows:1.下载安装包 https://www.python.org/downloads/2.安装 默认安装路径:C:\python273.配置环境变量 [右键计算机] ...

  3. 四川软件人才网:打造四川最专业的IT人才招聘平台

    四川软件人才网(www.tfsp.net),原名:天府软件人才网:为了更好的发展和拓展的业务需要,更名为:四川软件人才网,强力打造四川最专业的IT人才的招聘平台. 网站依托四川软件人才社区,微博,微信 ...

  4. CSS伪类选择器

    一.CSS伪类选择器用于给某些选择器添加效果语法规则:选择器:伪选择器例:a:link {color: #FF0000} 未访问的链接 a:visited {color: #00FF00} 已访问的链 ...

  5. XCode一直显示"scanning for working copies"的解决办法

    一个SVN上的项目,在本地重新CheckOut打开后,一直提示"scanning for working copies"且不能使用SVN的更新.提交等功能,当时想着晾它一晚上,看能 ...

  6. PHP内核探索:数组与链表

    在C语言中,我们可以自定义各种各样的数据结构,用来把很多数据保存在一个变量里面,但是每种数据结构都有自己的优缺点,PHP内核规模如此庞大,是否已经找到了一些非常棒的解决方法呢? 我们在选择各种数据结构 ...

  7. Oozie命令行常用命令汇总[转]

    Oozie命令行常用命令汇总 有时候脚本跑多了就不愿意在OozieWeb端去看脚本的运行情况了.还好Oozie提供了很多命令行命令.能通过命令行直接检索自己想看到的脚本信息.在这里简单进行一下总结.一 ...

  8. js实现单文件以及多文件下载

    <script type="text/javascript"> /** * Javascript 多文件下载 * @author Barret Lee * @email ...

  9. Yaf零基础学习总结4-Yaf的配置文件

    在上一节的hello yaf当中我们已经接触过了yaf的配置文件了, Yaf和用户共用一个配置空间, 也就是在Yaf_Application初始化时刻给出的配置文件中的配置. 作为区别, Yaf的配置 ...

  10. 《理解 ES6》阅读整理:函数(Functions)(三)Function Constructor & Spread Operator

    增强的Function构造函数(Increased Capabilities of the Function Constructor) 在Javascript中Function构造函数可以让你创建一个 ...