BaseAdapter的使用(笔记)

适配器模式的应用:

1.降低程序耦合性

2.容易扩展

BaseAdapter

ListView的显示与缓存机制:需要才显示,显示完就被会受到缓存。

BaseAdapter基本结构

--public int getCount(); 适配器中数据集中数据的个数

--public Object getItem(int position):获取数据集中与指定索引对应的数据项

--public long getItem(int position):获取指定行对应的ID

--public View getView(int position, ViewconverView, ViewGroup parent):获取每一个Item的显示内容

第一步: 创建布局文件 activity_main.xml  创建好了一个简单的listView

创建item布局文件item.xml,其中有一个ImageView 两个 TextView

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/lv_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/iv_image"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/ic_launcher"/>
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_toEndOf="@+id/iv_image"
        android:text="Title"
        android:gravity="center"
        android:textSize="25sp"/>
    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_below="@+id/tv_title"
        android:layout_toRightOf="@+id/iv_image"
        android:text="content"
        android:gravity="center_vertical"
        android:textSize="20sp"/>
</RelativeLayout>

效果如图:

第二步:创建一个Bean对象ItemBean,封装item中显示的内容,在主页面MainActivity.java里面创建数据源

ItemBean.java

public class ItemBean {

	public int ItemImageResid;
	public String Itemtitle;
	public String ItemContent;

	public ItemBean(int itemImageResid, String itemtitle, String itemContent) {
		super();
		ItemImageResid = itemImageResid;
		Itemtitle = itemtitle;
		ItemContent = itemContent;
	}

}

MainActivity.java

package com.example.sr;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        List<ItemBean> itemBeanList = new ArrayList<ItemBean>();
        for(int i = 0; i < 20; i++){
        	itemBeanList.add(new ItemBean(R.drawable.ic_launcher, "我是标题"+i, "我是内容"+i));
        }
    }
}

第三步:新建MyAdapter类,继承自BaseAdapter , 重写里面的方法,实现适配器

MyAdapter.java

package com.example.sr;

import java.util.List;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class MyAdapter extends BaseAdapter {

	private List<ItemBean> mList;

	public MyAdapter(List<ItemBean> list){  //数据源与适配器进行了关联
		mList = list;
	}

	@Override
	public int getCount() { //返回ListView需要显示的数据量
		// TODO Auto-generated method stub
		return mList.size();
	}

	@Override
	public Object getItem(int position) {//获取数据集中与指定索引对应的数据项
		// TODO Auto-generated method stub
		return mList.get(position);
	}

	@Override
	public long getItemId(int position) {//获取指定行对应的ID
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int arg0, View arg1, ViewGroup arg2) {//返回每一项的显示内容
		// TODO Auto-generated method stub
		return null;
	}

}

上面最主要的是getView方法,还没有实现,下面介绍getView方法实现的三重境界

1.逗比式

MyAdapter.java

package com.example.sr;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {

	private List<ItemBean> mList;
	private LayoutInflater minflater;//布局装载器对象,用于把xml布局文件转化为view

	public MyAdapter(Context context, List<ItemBean> list){  //数据源与适配器进行了关联
		mList = list;
		minflater = LayoutInflater.from(context);//context要使用当前的Adapter的界面对象
	}

	@Override
	public int getCount() { //返回ListView需要显示的数据量
		// TODO Auto-generated method stub
		return mList.size();
	}

	@Override
	public Object getItem(int position) {//获取数据集中与指定索引对应的数据项
		// TODO Auto-generated method stub
		return mList.get(position);
	}

	@Override
	public long getItemId(int position) {//获取指定行对应的ID
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int postion, View convertView, ViewGroup parent) {//返回每一项的显示内容
		// TODO Auto-generated method stub
		View view = minflater.inflate(R.layout.item, null);
		//第一个参数为 需要装载到item.xml布局文件,第二个参数通常写null

		ImageView imageView = (ImageView) view.findViewById(R.id.iv_image);
		TextView title = (TextView)view.findViewById(R.id.tv_title);
		TextView content = (TextView)view.findViewById(R.id.tv_content);

		//将数据取出来赋给这三个控件
		ItemBean bean = mList.get(postion);
		imageView.setImageResource(bean.ItemImageResid);
		title.setText(bean.Itemtitle);
		content.setText(bean.ItemContent);

		return view;
	}

}

回到MainActivity.java   建立listView与MyAdapter的联系

MainActivity.java

package com.example.sr;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        List<ItemBean> itemBeanList = new ArrayList<ItemBean>();
        for(int i = 0; i < 20; i++){
        	itemBeanList.add(new ItemBean(R.drawable.ic_launcher, "我是标题"+i, "我是内容"+i));
        }

        //建立listView与MyAdapter的联系
        ListView listView = (ListView) findViewById(R.id.lv_main);
        listView.setAdapter(new MyAdapter(this, itemBeanList));//第一个参数为context,第二个是数据源

    }
}

至此,运行程序,发现listView可以显示我们想要的东西了。

为什么式逗比式呢?listView有缓冲机制,但是在getView无视了缓冲机制,都通过创建一个新的view去设置空间,效率及其低下,完全没有利用到listView的缓存机制。

2. 普通式

修改getView方法

<span style="white-space:pre">	</span>@Override
	public View getView(int postion, View convertView, ViewGroup parent) {//返回每一项的显示内容
		// TODO Auto-generated method stub

		//逗比式开始----------
		//View view = minflater.inflate(R.layout.item, null);
		//第一个参数为 需要装载到item.xml布局文件,第二个参数通常写null
		/*
		ImageView imageView = (ImageView) view.findViewById(R.id.iv_image);
		TextView title = (TextView)view.findViewById(R.id.tv_title);
		TextView content = (TextView)view.findViewById(R.id.tv_content);

		//将数据取出来赋给这三个控件
		ItemBean bean = mList.get(postion);
		imageView.setImageResource(bean.ItemImageResid);
		title.setText(bean.Itemtitle);
		content.setText(bean.ItemContent);
		*/
		//逗比式结束-----------

		//普通式,参数中已经有了一个converView,考虑是否缓存过了,如果缓存过了,可以直接使用
		if(convertView == null){
			convertView = minflater.inflate(R.layout.item, null);
		}
		ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_image);
		TextView title = (TextView)convertView.findViewById(R.id.tv_title);
		TextView content = (TextView)convertView.findViewById(R.id.tv_content);
		ItemBean bean = mList.get(postion);
		imageView.setImageResource(bean.ItemImageResid);
		title.setText(bean.Itemtitle);
		content.setText(bean.ItemContent);

		return convertView;
	}

利用了ListView的缓存特性,如果没有缓存才创建新的View,算入门,但是findViewById依然会浪费大量时间

3. 文艺式(最好的)

创建了一个内部类 ViewHolder ,它与view相关联,并缓存item的组件,这样给item设置内容的时候,不用再去findviewById, 直接在ViewHolder里面取出来就行了。

<span style="white-space:pre">	</span>@Override
	public View getView(int postion, View convertView, ViewGroup parent) {//返回每一项的显示内容
		// TODO Auto-generated method stub

		//逗比式开始----------
		//View view = minflater.inflate(R.layout.item, null);
		//第一个参数为 需要装载到item.xml布局文件,第二个参数通常写null
		/*
		ImageView imageView = (ImageView) view.findViewById(R.id.iv_image);
		TextView title = (TextView)view.findViewById(R.id.tv_title);
		TextView content = (TextView)view.findViewById(R.id.tv_content);

		//将数据取出来赋给这三个控件
		ItemBean bean = mList.get(postion);
		imageView.setImageResource(bean.ItemImageResid);
		title.setText(bean.Itemtitle);
		content.setText(bean.ItemContent);
		*/
		//逗比式结束-----------

		//普通式,参数中已经有了一个converView,考虑是否缓存过了,如果缓存过了,可以直接使用---------
		/*
		 if(convertView == null){
			convertView = minflater.inflate(R.layout.item, null);
		}
		ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_image);
		TextView title = (TextView)convertView.findViewById(R.id.tv_title);
		TextView content = (TextView)convertView.findViewById(R.id.tv_content);
		ItemBean bean = mList.get(postion);
		imageView.setImageResource(bean.ItemImageResid);
		title.setText(bean.Itemtitle);
		content.setText(bean.ItemContent);
		return convertView;
		*/
		//普通式结束-----------------

		ViewHolder viewHolder;
		if(convertView == null){
			viewHolder = new ViewHolder();
			convertView = minflater.inflate(R.layout.item, null);
			viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_image);//把控件保存在ViewHolder中
			viewHolder.title = (TextView)convertView.findViewById(R.id.tv_title);
			viewHolder.content = (TextView)convertView.findViewById(R.id.tv_content);
			convertView.setTag(viewHolder);//进行关联,把它的控件保存在viewHolder中,避免了findviewbyid去实例化
		}else{
			viewHolder = (ViewHolder)convertView.getTag();
		}
		ItemBean bean = mList.get(postion);
		viewHolder.imageView.setImageResource(bean.ItemImageResid);
		viewHolder.title.setText(bean.Itemtitle);
		viewHolder.content.setText(bean.ItemContent);
		return convertView;

	}

	class ViewHolder{  //首先创建内部类
		public ImageView imageView;
		public TextView title;
		public TextView content;
	}

不仅利用了ListView的缓存,更通过ViewHolder类来实现显示数据的视图的缓存,避免多次通过findViewById寻找控件,这是最好的方法。

总结:

ViewHolder优化BaseAdapter的思路

--创建Bean对象,用于封装数据

--创建MyAdapter(继承BaseAdapter)在构造方法中初始化用于映射的数据List

--创建ViewHolder类,创建布局映射关系

--判断ConverView,为空则创建,并设置Tag,否则通过tag来取出ViewHolder

--给ViewHolder中的控件设置数据

源代码下载:BaseAdapter的使用

时间: 2024-10-03 05:24:08

BaseAdapter的使用(笔记)的相关文章

android学习笔记——利用BaseAdapter生成40个列表项

RT: main.xml ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:orientation="vertical"        

【Android适配器系列】BaseAdapter学习笔记

慕客网-Android必学-BaseAdapter的使用与优化-学习笔记 什么是数据适配器 数据适配器是数据源与视图(View)之间的桥梁,建立了两者之间的适配关系.数据的来源是各种各样的,但View能显示的格式却是有一定要求的,数据适配器是把各种各样的数据源转化成为View能显示的数据格式. 优点: 将数据的来源与数据的显示进行了解耦,降低程序的耦合性,提高可扩展性. BaseAdapter是Android各种各样适配器里最通用的适配器. BaseAdapter基本结构 public int

Android学习笔记-构建一个可复用的自定义BaseAdapter

转载自http://www.runoob.com/w3cnote/android-tutorial-customer-baseadapter.html   作者:coder-pig 本节引言: 如题,本节给大家带来的是构建一个可复用的自定义BaseAdapter,我们每每涉及到ListView GridView等其他的Adapter控件,都需要自己另外写一个BaseAdapter类,这样显得非常麻烦, 又比如,我们想在一个界面显示两个ListView的话,我们也是需要些两个BaseAdapter

Android学习笔记之PullToRefreshListView和BaseAdapter的使用

下拉刷新是很多应用都使用的很流行的一种效果,今天也算是彻底的理解了一下PullToRefreshListView的使用,但是弄了一天却在一个很傻的地方犯了错误. @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(context

Android笔记(二十五) ListView的缓存机制与BaseAdapter

之前接触了ListView和Adapter,Adapter将数据源和View连接起来,实际应用中,我们要显示的数据往往有很多,而屏幕只有那么大,系统只能屏幕所能显示的内容,当我们滑动屏幕,会将旧的内容放入到缓冲池中,再从缓存池中拿出新的内容显示出来,这就是ListView的缓存机制,这一机制可以极大的节省系统资源. BaseAdapter BaseAdapter通常用于被扩展,扩展BaseAdapter可以对各项列表进行最大限度的定制. 我们可以用自己的类去继承BaseAdapter,然后实现g

Android学习笔记(五) BaseAdapter

本人是在使用Listview时,由于需要自定义ListView的Item,因此需要自己写一个Adapter,使用到了BaseAdapter.对BaseAdapter中的getItem()以及getItemId()略感疑惑,因此从网上查找资料得出自己的见解: 参考了这篇博文:http://www.cnblogs.com/qzxia/archive/2010/10/25/1860602.html getItem并不是由Android系统主动进行调用,而是提供了一个接口方便我们在编写item的onCl

Android学习笔记:ListView及BaseAdapter使用

ListView是Android中常用的重要组件之一,基本上所有软件基本都会使用ListView,所以要对ListView非常熟悉. 先看看程序效果图: ListView的样式很多,有纯文字型,带图片显示,带按钮的等等.本次演示一个带图片的ListView. ①布局文件: 在ListView程序中,布局文件相比其他普通控件会多出至少一个,其原因是还需要一个关于ListView里面内容条目的布局文件. 内容条目的布局文件 listview_item.xml : <?xml version="

Android(java)学习笔记137:Android中SimpleAdapter,ArrayAdapter和BaseAdapter详解

1.SimpleAdapter(很多时候需要继承它,来自定义adapter): simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片)等.可以显示比较复杂的列表,包括每行显示图片.文字等,但不能对列表进行后期加工(在java代码中加工),也是只是单纯的负责显示 public class ImageListView extends ListActivity { @Override public void onCreate(Bundle savedIn

Android开发笔记(12)——ListView &amp; Adapter

转载请注明:http://www.cnblogs.com/igoslly/p/6947225.html 下一章是关于ListFragment的内容,首先先介绍ListView的相关配置,理解ListFragment也相较容易. 在fznpcy专栏:http://blog.csdn.net/fznpcy/article/details/8658155/有较为详尽的讲解和范例. ListView & Adapter 一.Adapter Adapter是连接后端数据和前端显示的适配器接口,是数据和UI