`

ListView——BaseAdapter

 
阅读更多
自定义Adapter继承BaseAdapter

Custom_BaseAdapterActivity.java

public class Custom_BaseAdapterActivity extends ListActivity {

	List<Map<String,Object>> list;
	
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		list = getListData();
		setContentView(R.layout.listdemo2);
		
		MyAdapter myAdapter = new MyAdapter(this);
		setListAdapter(myAdapter);
	}
	
	public List<Map<String,Object>> getListData(){
		list = new ArrayList<Map<String,Object>>();
		
		Map<String,Object> map1 = new HashMap<String,Object>();
		Map<String,Object> map2 = new HashMap<String,Object>();
		map1.put("headimg", R.drawable.lxq);
		map1.put("nickname", "蜗牛/");
		map1.put("textsign", "乘着风游荡在蓝天边 一片云掉落在我面前.");
		
		map2.put("headimg", R.drawable.hyl);
		map2.put("nickname", "轩凌涵舞");
		map2.put("textsign", "以后我儿子得有两门必修课,打篮球和拉小提琴.");
		
		list.add(map1);
		list.add(map2);
		
		return list;
	}
	
	public final class ViewHolder{
		public ImageView headimg;
		public TextView nickname;
		public TextView textsign;
		public Button listbtn;
	}
	
	public class MyAdapter extends BaseAdapter{
		
		private LayoutInflater flater;
		
		public MyAdapter(Context context) {
			super();
			this.flater = LayoutInflater.from(context);
		}

		public int getCount() {
			// TODO Auto-generated method stub
			return list.size();
		}

		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return null;
		}

		public long getItemId(int arg0) {
			// TODO Auto-generated method stub
			return 0;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			ViewHolder holder = null;
			if(convertView == null){
				holder = new ViewHolder();
				convertView = flater.inflate(R.layout.user2, null);
				holder.headimg = (ImageView) convertView.findViewById(R.id.headimg);
				holder.nickname = (TextView) convertView.findViewById(R.id.nickname);
				holder.textsign = (TextView) convertView.findViewById(R.id.textsign);
				holder.listbtn = (Button) convertView.findViewById(R.id.listbtn);
				convertView.setTag(holder);
			}
			else{
				holder = (ViewHolder) convertView.getTag();
			}
			holder.headimg.setBackgroundResource((Integer)list.get(position).get("headimg"));
			holder.nickname.setText((String)list.get(position).get("nickname"));
			holder.textsign.setText((String)list.get(position).get("textsign"));
			holder.listbtn.setOnClickListener(new View.OnClickListener() {
				public void onClick(View arg0) {
				}
			});
			return convertView;
		}
	}
}




listdemo2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:gravity="center_horizontal"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  
   <TextView
	android:gravity="center_horizontal"
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:text="默默 De 爱"
  	android:textSize="12pt"
  	android:textStyle="italic"
  />
  
  <ListView
  	android:id="@+id/android:list"
  	android:gravity="center_horizontal"
  	android:layout_width="fill_parent"
  	android:layout_height="fill_parent"
  	android:scrollbars="vertical"
  />
</LinearLayout>


user2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  
  <LinearLayout
  	android:orientation="horizontal"
  	android:gravity="center_vertical"
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:layout_margin="5px"
  	android:layout_alignParentLeft="true"
  >
  <ImageView
  	android:id="@+id/headimg"
  	android:layout_width="64px"
  	android:layout_height="64px"
  />
  <LinearLayout
  	android:orientation="vertical"
  	android:layout_width="wrap_content"
  	android:layout_height="wrap_content"
  	android:layout_marginLeft="4dip"
  >
  <TextView
  	android:id="@+id/nickname"
  	android:layout_width="wrap_content"
  	android:layout_height="wrap_content"
  	android:textSize="8pt"
  	android:textStyle="bold"
  	android:textColor="#FFFFFF"
  />
  
  <TextView
  	android:id="@+id/textsign"
  	android:layout_width="wrap_content"
  	android:layout_height="wrap_content"
  	android:textSize="6pt"
  	android:singleLine="true"
  	android:textColor="#FFFFFF"
  />
  </LinearLayout>
  </LinearLayout>
  <Button
  	android:id="@+id/listbtn"
  	android:layout_marginLeft="20px"
  	android:layout_width="wrap_content"
  	android:layout_height="wrap_content"
  	android:text="Click"
  	android:layout_alignParentRight="true"
  	android:layout_centerVertical="true"
  />
</RelativeLayout>


引用
编写自定义Adapter可以继承BaseAdapter类,如果是数据库使用可以继承CursorAdapter。在本例中继承了BaseAdapter类,BaseAdapter是一个抽象类,必须在它的子类中实现下面的方法:


• int getCount()   返回总数据源中总的记录数;
• Object getItem(int position)   根据选择的项目的位置,获得选择的数据源中某个项目的数据;
• long getItemId(int position)   根据选择的项目的位置;
• View getView(int position, View convertView, ViewGroup parent)   获得要展示的项目View对象。


这里最为麻烦的方法就是getView(),getView()方法是ListView的每个列表项目绘制在屏幕上时被调用。该方法其中的一个参数是convertView,在ListView第一次显示列表项目的时候,convertView是null值。当向上滑动屏幕时候,屏幕上面的列表项目退出屏幕,屏幕下面原来不可见的列表项目会进入屏幕,这个时候的convertView不是null值,下面代码的处理对于提供ListView控件提高性能是至关重要的。


if (convertView == null) {
convertView = mInflater.inflate(R.layout.main, null);

holder = new ViewHolder();
holder.text = (TextView) convertView
.findViewById(R.id.textview);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);

convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
只有在convertView为null时才去实例化控件,创建convertView对象、holder对象,其中convertView对象是通过mInflater.inflate(R.layout.main, null)方法,从一个main.xml布局文件中加载并创建的。
而在convertView非null的时候不会实例化控件,否则每次都要实例化控件,当列表项目很多时,用户反复滑动屏幕会有“卡”的感觉,不再流畅了。
ViewHolder类是将每一个项目中的控件封装起来的类,可以在convertView 为null时候创建ViewHolder类的实例holder,然后通过convertView.setTag(holder);把它放到convertView中,而在convertView非null时候,再通过convertView.getTag()过的一个ViewHolder类的实例,这样在翻屏的时候就不会反复创建ViewHolder实例对象了,就本例而言只是创建了9个ViewHolder实例。

  • 大小: 63.9 KB
分享到:
评论
2 楼 龙哥IT 2011-10-09  
搞定
1 楼 龙哥IT 2011-10-09  
为什么我滴出不来啊

相关推荐

    Android 适配器——BaseAdapter

    在Android开发中,适配器(Adapter)是一个关键的概念,它起到了桥梁的作用,连接数据源与视图组件,使得数据可以被显示在ListView、GridView、Spinner等控件中。BaseAdapter是所有自定义适配器的基类,它提供了一个...

    Android之ListView+BaseAdapter左右按键切换

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

    Android下拉刷新ListView——RTPullListView

    通常Adapter会继承自BaseAdapter或其变种。 4. **设置监听器**:通过设置OnRefreshListener,监听下拉刷新事件。在`onRefresh()`方法中,加载新的数据并更新ListView。 ```java pullListView.setOnRefreshListener...

    ListView优化+baseAdapter

    在实际开发中,为了满足个性化需求,我们往往需要在ListView的每个Item中添加按钮、图像等复杂组件,这时,系统默认的Adapter可能无法满足需求,我们就需要用到自定义Adapter——BaseAdapter。 BaseAdapter是...

    listview简单的demo。BaseAdapter的使用

    6. **适配器模式**:BaseAdapter是一种设计模式——适配器模式的体现,它使得不兼容的接口能够协同工作。在这个案例中,它让我们的数据结构(可能是ArrayList或其他集合)能与ListView的接口相匹配。 7. **使用场景...

    ListView用法大集合

    本篇文章将深入探讨ListView的各种用法,包括不同类型的Adapter及其基础——BaseAdapter。 首先,我们来看`5.ListViewArrayAdapterDemo`。ArrayAdapter是ListView最常用的适配器之一,它用于将数组数据绑定到...

    Android源码——listView学习源码.zip

    本资源"Android源码——listView学习源码.zip"包含了对ListView工作原理的详细解析,以及可能的实践代码示例。 ListView的核心功能在于它可以动态加载和回收视图,以优化内存使用。当用户滚动列表时,ListView会...

    安卓Android源码——listView.rar

    这份"安卓Android源码——listView.rar"压缩包很可能包含了一份关于ListView自定义实现和优化的源代码示例。下面我们将深入探讨ListView在Android中的工作原理、常见用法以及如何进行性能优化。 首先,ListView基于...

    安卓Android源码——Listview分页加载数据.zip

    "安卓Android源码——Listview分页加载数据.zip"这个压缩包可能包含了一个示例项目,演示了如何在ListView中实现分页加载功能。下面我们将深入探讨这个主题。 1. **ListView基础**:ListView是Android SDK中的一个...

    android自定义的Adapter--BaseAdapter范例

    本篇文章将详细讲解如何创建一个自定义的Adapter——BaseAdapter,并通过一个实际的范例来帮助大家理解和应用。 BaseAdapter是Android SDK提供的一个抽象类,它是所有自定义Adapter的基础。它要求开发者实现几个...

    安卓Android源码——listView学习源码.zip

    这份"安卓Android源码——listView学习源码.zip"压缩包提供了学习ListView的源码,非常适合开发者深入理解ListView的工作原理和实现方式。在这个源码分析中,我们将探讨ListView的关键特性、工作流程以及如何自定义...

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

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

    Android基础编程-BaseAdapter创建列表.pptx

    本讲座将深入讲解如何使用BaseAdapter来创建列表,并通过一个具体的案例——道路交通标志列表,来阐述其工作原理和实现步骤。 首先,理解`BaseAdapter`的基本概念。BaseAdapter是所有自定义Adapter的基础,它是一个...

    那些复杂的列表总要弄个清楚——(四)激动人心的BaseAdapter之二

    本篇文章将深入探讨“那些复杂的列表总要弄个清楚——(四)激动人心的BaseAdapter之二”这一主题,这主要是关于如何利用BaseAdapter高效地适配ListView的数据。 BaseAdapter是Android提供的一个抽象类,它是...

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

    这个"安卓Android源码——ListView下拉刷新Demo.zip"包含了一个实现ListView下拉刷新功能的示例代码,这对于理解和应用这种常见用户交互模式至关重要。下拉刷新是移动应用中常见的功能,允许用户通过在列表顶部向下...

    安卓Android源码——使用listView实现的树状结构.zip

    在这个项目中,我们可能使用了BaseAdapter或者自定义的Adapter,如TreeAdapter,来处理树形结构的数据。Adapter需要重写的方法包括`getViewCount()`(返回ListView的行数)、`getItem()`(获取指定位置的数据项)...

    安卓Andriod源码——listview上拉刷新.zip

    - 通过Adapter类(如BaseAdapter、ArrayAdapter等)将数据绑定到ListView,Adapter是数据源和视图之间的桥梁。 2. **上拉刷新概念**: - 上拉刷新(Pull-to-Refresh)是一种常见的UI设计模式,允许用户在列表底部...

    安卓Android源码——ListView分页功能源码.zip

    本资源"安卓Android源码——ListView分页功能源码.zip"提供了一个实现ListView分页功能的示例源码,这对于处理大数据集和优化用户界面至关重要。下面将详细探讨ListView分页的基本原理和实现方法。 首先,ListView...

    安卓Andriod源码——ListView&时间轴.zip

    【标题】"安卓Android源码——ListView&时间轴"揭示了这个压缩包文件的主要内容,它专注于Android操作系统中两个关键的UI组件:ListView和时间轴(Timeline)的设计与实现。ListView是Android应用开发中常见的视图...

    安卓Android源码——ListView滚动气泡提示.zip

    这份"安卓Android源码——ListView滚动气泡提示.zip"的压缩包很可能是包含了一个实现此类功能的示例项目或者库。 首先,我们来了解一下ListView的基本概念。ListView是Android SDK中的一个视图组件,主要用于展示长...

Global site tag (gtag.js) - Google Analytics