`
韩悠悠
  • 浏览: 842627 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android ListView理解之BaseAdapter .

 
阅读更多

ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来。一般而言,一个ListView由以下三个元素组 成:

1.View,用于展示列表,通常是一个xml所指定的。大家都知道Android的界面基本上是由xml文件负责完成的,所以ListView的界 面也理所应当的使用了xml定义。例如在ListView中经常用到的“android.R.layout.simple_list_item_1”等, 就是Android系统内部定义好的一个xml文件。

2.适配器,用来将不同的数据映射到View上。不同的数据对应不同的适配器,如ArrayAdapter,CursorAdapter, SimpleAdapter等, 他们能够将数组,指针指向的数据,Map等数据映射到View上。也正是由于适配器的存在,使得ListView的使用相当灵活,经过适配器的处理后,在 view看来所有的数据映射过来都是一样的。3.数据,具体的别映射的数据和资源,可以是字符串,图片等,通过适配器,这些数据将会被现实到 ListView上。所有的数据和资源要显示到ListView上都通过适配器来完成。

系统已有的适配器可以将基本的数据显示到ListView上,如:数组,Cursor指向的数据,Map里的数据。但是在实际开发中这些系统已实现 的适配器,有时不能满足我们的需求。而且系统自带的含有多选功能ListView在实际使用过程中会有一些问题。要实现复杂的ListView可以通过继 承ListView并重写相应的方法完成,同时也可以通过继承BaseAdapter来实现。通过文档可以看出,ArrayAdapter,CursorAdapter, SimpleAdapter都继承于BaseAdapter。所以通过继承BaseAdapter就可以完成自己的Adapter,可以将任何复杂组合的数据和资源,以任何你想要的显示效果展示给大家。

继承BaseAdapter之后,需要重写以下四个方法:getCount,getItem,getItemId,getView。

ListView绘制的过程如下:首先,系统在绘制ListView之前,将会先调用getCount方法来获取Item的个数。之后每绘制一个 Item就会调用一次getView方法,在此方法内就可以引用事先定义好的xml来确定显示的效果并返回一个View对象作为一个Item显示出来。也 正是在这个过程中完成了适配器的主要转换功能,把数据和资源以开发者想要的效果显示出来。也正是getView的重复调用,使得ListView的使用更 为简单和灵活。这两个方法是自定ListView显示效果中最为重要的,同时只要重写好了就两个方法,ListView就能完全按开发者的要求显示。而 getItem和getItemId方法将会在调用ListView的响应方法的时候被调用到。所以要保证ListView的各个方法有效的话,这两个方 法也得重写。比如:没有完成getItemId方法的功能实现的话,当调用ListView的getItemIdAtPosition方法时将会得不到想 要的结果,因为该方法就是调用了对应的适配器的getItemId方法。


 

另外,对于setTag方法是干什么的,SDK解释为

Tags

Unlike IDs, tags are not used to identify views. Tags are essentially an extra piece of information that can be associated with a view. They are most often used as a convenience to store data related to views in the views themselves rather than by putting them in a separate structure.

Tag不像ID是用标示view的。Tag从本质上来讲是就是相关联的view的额外的信息。它们经常用来存储一些view的数据,这样做非常方便而不用存入另外的单独结构。

convertView中的TAG

1.  对于使用了LayoutInflater对象进行View扩充的Tag的使用

public View getView(int position, View convertView, ViewGroup parent) {

 

       ViewHolder holder = null;

       if (convertView == null) {

 

          holder = new ViewHolder();

 

          convertView = inflater.inflate(R.layout.vlist2, null);

          holder.img = (ImageView) convertView.findViewById(R.id.img);

          holder.title = (TextView) convertView.findViewById(R.id.title);

           holder.info = (TextView)

convertView.findViewById(R.id.info);

          // setTag的妙用

          convertView.setTag(holder);

 

       } else {

          // setTag的妙用

          holder = (ViewHolder) convertView.getTag();

       }

 

 ……略

}


首先我们要知道setTag方法是干什么的,他是给View对象的一个标签,标签可以是任何内容,我们这里把他设置成了一个对象,因为我们是把vlist2.xml的元素抽象出来成为一个类ViewHolder,用了setTag,这个标签就是ViewHolder实例化后对象的一个属性。我们之后对于ViewHolder实例化的对象holder的操作,都会因为java的引用机制而一直存活并改变convertView的内容,而不是每次都是去new一个。我们就这样达到的重用——我希望我说清楚了。如果有更简单的解释,请指教。

这是我们在Adapter中的使用,那么我们在这里不使用Tag标签会怎么样呢?

我们试想,如果我们不用Tag标签,那么我们的对象如何与convertView缓存结合并达到合理的效率利用?貌似答案并不明朗——所以使用Tag是比较明智的做法。

 

2.  对于没有使用LayoutInflater对象进行View扩充的Tag的使用。

if (convertView != null) {

  view = convertView;

  ...

  } else {

  view = new Xxx(...);

  ...

  }

这是我们的程序,我们看到,貌似没有用Tag——是的,当没有使用LayoutInflater进行View的扩充的时候,是没有必要用的,虽然也可以用。

分享到:
评论

相关推荐

    android BaseAdapter listView优化

    在Android开发中,ListView是一个非常重要的组件,常用于展示大量数据列表。BaseAdapter则是与ListView配合使用的数据适配器,负责将数据绑定到ListView的各个视图上。本篇文章将深入探讨ListView与BaseAdapter的...

    Android之ListView+BaseAdapter左右按键切换

    在这个"Android之ListView+BaseAdapter左右按键切换"的项目中,我们将会深入探讨如何利用ListView结合BaseAdapter实现通过键盘左右按键来切换并更新ListView中的数据。BaseAdapter是Android系统提供的一种适配器,它...

    Android ListView分页功能源码.rar

    在Android中,ListView的分页通常通过Adapter类来实现,如BaseAdapter或CursorAdapter。当用户滚动到列表底部时,会触发加载更多数据的逻辑。这一过程涉及以下几个关键知识点: 1. **监听器OnScrollListener**:...

    Android ListView下拉刷新 Demo.zip

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。这个"Android ListView下拉刷新 Demo.zip"文件很显然是一个示例项目,演示了如何在ListView中实现下拉刷新的功能。下拉刷新是移动应用中常见的...

    Android ListView下拉刷新 Demo.rar

    在Android开发中,ListView是一种常用的组件,用于展示大量的数据列表。"Android ListView下拉刷新 Demo.rar" 提供...对于Android新手,这是一个很好的实践案例,可以帮助他们理解和掌握ListView及下拉刷新的实现原理。

    Android ListView分页功能源码.zip

    总之,理解并掌握在Android ListView中实现分页功能是移动开发中的重要技能。这个源码示例为你提供了一个实践和学习的平台,帮助你更好地理解和应用这一技术。通过研究和学习这个示例,你可以提升自己的Android开发...

    Android ListView加载不同布局.解决异常ClassCastException

    在Android开发中,ListView是一种常用的组件,用于展示大量的数据列表。然而,在实现ListView时,我们可能会遇到一个问题,即加载不同布局导致的`ClassCastException`异常。这个异常通常出现在尝试将一个对象强制...

    Android listView时间轴效果.zip

    在Android开发中,ListView是一种常用的视图组件,用于展示大量数据...通过学习和实践这个项目,开发者不仅可以掌握如何在ListView中实现时间轴效果,还能加深对Android UI组件和数据绑定的理解,提升自己的开发技能。

    android应用源码Android重写listview实现下拉刷新.zip

    本教程将通过一个名为"android应用源码Android重写listview实现下拉刷新.zip"的压缩包,深入探讨如何在Android中自定义ListView并实现下拉刷新功能。这个压缩包包含了一份用于学习和参考的源码,主要涉及以下几个...

    Android listView学习源码.zip

    这份"Android listView学习源码.zip"提供了学习ListView使用和优化的基础示例,适合初学者深入理解其工作原理。 ListView的工作机制主要基于Adapter模式,Adapter是连接数据源和ListView的桥梁。在Android中,我们...

    Android中ListView,SQLite,BaseAdapter的结合源码

    在Android开发中,ListView、SQLite和BaseAdapter是三个至关重要的组件,它们共同协作,使得应用程序能够展示和管理大量数据。ListView是一种可滚动的视图,用于显示一系列项,而SQLite是一个轻量级的数据库系统,...

    可复用的BaseAdapter.rar

    本压缩包"可复用的BaseAdapter.rar"可能包含了一个通用的BaseAdapter实现,旨在提高代码的复用性,减少重复工作,优化开发效率。 BaseAdapter的基本原理是通过重写其方法来绑定数据到UI控件上。它主要有以下几个...

    C# xamarin android listview简单使用

    首先,我们需要理解ListView的基本结构。ListView通常与一个Adapter配合工作,Adapter是数据源和视图之间的桥梁,它负责将数据转化为ListView可以显示的列表项。在Xamarin.Android中,我们可以使用BaseAdapter或已有...

    安卓Android源码——ListView下拉刷新 Demo.zip

    本示例“安卓Android源码——ListView下拉刷新 Demo.zip”提供了一个具体的实现,帮助开发者理解和实现这一功能。 首先,我们要了解下拉刷新的基本原理。下拉刷新通常由两部分组成:UI动画和数据加载逻辑。UI动画是...

    Android应用源码 ListView下拉刷新 Demo.zip

    在Android应用开发中,ListView是常用...通过深入研究和实践这个"Android应用源码 ListView下拉刷新 Demo"项目,开发者可以更好地理解和掌握如何在Android应用中实现在ListView上的下拉刷新功能,提升应用的用户体验。

    Android应用源码之ListView滚动气泡提示.zip

    这个压缩包“Android应用源码之ListView滚动气泡提示.zip”可能包含了实现这一功能的源代码示例,帮助开发者理解并学习如何在自己的应用中添加这种滚动提示。 首先,我们需要了解ListView的基本原理。ListView通过...

Global site tag (gtag.js) - Google Analytics