Android中BaseAdapter原理

合集下载

Adapter适配器深刻详解

Adapter适配器深刻详解

Android Adapter深刻详解我在刚玩android 时候,对这个adapter很不理解,到底是什么原理呢?适配器,哎,只知道setAdapter()把参数传进去,系统就显示出来了。

今天,针对这个东西,我们做个系统详细的分析.listview加载adapter过程是这样的.1先判断adapter 有多少数据项,根据这个数据确定有多少item.2确定每个item里加载哪个View.3把View里加载要显示的数据.问提一个一个来解决.第一个问题:因为adapter都要关联一个list .有来存储数据.list的项数就是Item的数目.我们在重载BaseAdapter时候,都要实现这个函数public intgetCount() {return weatherList.size();}哎,这个函数就是确定关联条目的.第二个问题哪来的view 呢,当然我们自己创建的.重载BaseAdapter时候你要实现getView()这个函数,就是这个view.第三个问题,你自己创建的view.加载哪些数据你该知道的.呵呵.张豪就喜欢看例子,这个小伙子技术,管理都很牛,得以他为榜样.得努力.public class CustomAdapterActivity extends ListActivity{/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);ArrayList<Weather>weatherList = new ArrayList<Weather>();Weather w = new Weather( "London", 17, Weather.OVERCAST );weatherList.add( w );w = new Weather( "Paris", 22, Weather.OVERCAST );weatherList.add( w );w = new Weather( "Athens", 29, Weather.SUNNY );weatherList.add( w );w = new Weather( "Stockholm", 12, Weather.RAIN );weatherList.add( w );WeatherAdapterweatherAdapter = new WeatherAdapter(this,weatherList );setListAdapter( weatherAdapter );}}哎,这个大家都很清楚,关键问题是weatherAdapter哪来的呢?自己创建的啊,如果创建呢?public class WeatherAdapter extends BaseAdapter {private Context context;private List<Weather>weatherList; 这就是adapter关联的List,用来存储数据.还记的ArrayList 要往里传参数吗?传的也是这个类型啊.呵呵public WeatherAdapter(Context context, List<Weather>weatherList ) {this.context = context;this.weatherList = weatherList;}public intgetCount() {return weatherList.size();}public Object getItem(int position) {return weatherList.get(position);}public long getItemId(int position) {return position;}public View getView(int position, View convertView, ViewGroup parent) {Weather weather = weatherList.get(position);return new WeatherAdapterView(this.context, weather );}}哎,这段告诉了我们,有多少个Item,可以通过getCount()得到了。

BaseAdapter的理解

BaseAdapter的理解

Why:继承BaseAdapter时要重载的方法及各方法作用分类:android应用开发2012-03-24 08:00286人阅读评论(0)收藏举报object在我们需要定制自己的适配器时(adapter)时我们就需要继承BaseAdapter抽象类,除了必要的构造函数外有几个函数是必须要重载的,它们是:public abstract int getCount()public abstract Object getItem(int position)public abstract long getItemId(int position)public abstract View getView(int position, View convertView, ViewGroup parent)个函数的主要功能:1.先来看一下简略流程图(不一定非常精确,但大致流程是这样):由流程图可以看到getCount()和getView()的作用:1.getCount()决定了我们将要绘制的资源数,当然这个数目不能大于资源的总数,不过却可以小于资源的总数。

例如我们adapter管理的资源总共有10个,而我们通过getCount()返回的只有6个,那么最终GridView绘制出来的将只有6个。

2.getView():通过传入的参数position,加工成我们想要的View并返回,最终共GridView 使用那getItem()和getItemId()有什么用呢?我们知道,GridView将View以方格的方式展示出来之后是要与用户交互的(比如点击某张图片),为了更好的相应用户的动作,我们就要用到这两个函数了。

本文相关资源:1.实例截图:而getItem和getItemId方法将会在调用ListView的响应方法的时候被调用到。

所以要保证ListView的各个方法有效的话,这两个方法也得重写。

比如:没有完成getItemId方法的功能实现的话,当调用ListView的getItemIdAtPosition方法时将会得不到想要的结果,因为该方法就是调用了对应的适配器的getItemId方法。

BaseAdapter_getView

BaseAdapter_getView

BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter,我们经常使用的ListView 的adapter,即SimpleAdapter,是继承自BaseAdapter的,BaseAdapter是一个基类,没有实现绑定数据的功能,SimpleAdapter实现了基本控件的绑定,如TextView,Button,ImageView).已经为我们实现好了数据优化工作,这些适配器使用相同组件动态绑定数据的方式进行优化。

为什么需要优化呢?因为如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?这不可能,因为内存有限制。

实际上Android为你缓存了视图。

Android中有个叫做Recycler的构件,下图是他的工作原理:如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。

其实我的理解Recyler就是一个队列,用来存储不在屏幕范围内的item,如果item滚出屏幕范围,那么就入队,这里的滚出是完全滚出,即边界等也要完全滚出。

如果新的item 要滚进来,那么android系统的framework就会查看Recyler是否含有可以重复使用的view,如果有那么就重新设置该view的数据源,然后显示,即出队。

那么这么多的item 其实只需要占用一定空间的内存,这个内存大小是多少呢?我的感觉是手机屏幕所包含的item的个数,再加上1,然后乘以每个item占用的内存。

但是最后我发现是加上2.可能是为了使得缓存更大吧。

但是为什么加上2,大家应该理解,如果你不理解,那你就把滚动list的过程好好想一想。

那个队列无非就是一个缓存罢了,因为我们的目的是通过那个缓存来重复使用那些已经创建的view。

使用BaseAdapter的话需要重载四个方法,这些方法分别是getCount,getItem,getItemId,最后一个最重要的是getView,getView函数为什么重要呢?因为它是用来刷新它所在的ListView的。

Android适配器(Adapter)

Android适配器(Adapter)

Android适配器(Adapter)简单来说就是对数据和界⾯的适配。

⼀些不能直接赋值到界⾯上的数据类型(如List,Map等),就要靠适配器来展⽰到页⾯界⾯适配器控件⼯作流程:集合类数据对象 --> 适配器对象 --> 适配器控件1.ArrayAdapter主要⽤于纯⽂本数据的显⽰2.SimpleAdapter可⽤于复杂的数据显⽰,将集合中不同的数据项填充到不同的View的不同组件中3.BaseAdapter它是以上适配器的公共基类,可以实现以上适配器的所有功能,且可以⾃定义Adapter来定制每个条⽬的外观功能,具有较⾼的灵活性最终效果图:1.界⾯布局:说明:上⾯是约束布局组件,下⾯是ListView组件2.ListView组件中每⼀个item的布局3.为Item创建实体类public class QQMsgBean {private int qq_icon;private String qq_name;private String lastmsg_time;private String lasttitle;private String noetrendmsg_count;public QQMsgBean(int qq_icon, String qq_name, String lastmsg_time, String lasttitle, String noetrendmsg_count) { this.qq_icon = qq_icon;this.qq_name = qq_name;stmsg_time = lastmsg_time;sttitle = lasttitle;this.noetrendmsg_count = noetrendmsg_count;}//get,set⽅法....}4.创建⼀个适配器类该类继承BaseAdapter类,负责把数据和界⾯适配public class QQMsgAdapter extends BaseAdapter {private List<QQMsgBean> data; //数据private Context context; //上下⽂对象,⽅便getItem⽅法使⽤//构造器⽅法public QQMsgAdapter(List<QQMsgBean> data, Context context) {this.data = data;this.context = context;}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}//获取每⼀⾏item的显⽰内容@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if(convertView == null){ //充分利⽤缓存机制提⾼效率convertView = LayoutInflater.from(context).inflate(yout.item_qqmessage,parent,false);}QQMsgBean bean = data.get(position); //通过索引获取对应的数据对象ImageView img = (ImageView)convertView.findViewById(R.id.img_qqicon);//获取view组件img.setImageResource(bean.getQq_icon()); //传⼊值给view组件TextView name = (TextView)convertView.findViewById(_qqname);name.setText(bean.getQq_name());TextView lasttitle = (TextView)convertView.findViewById(_lasttitle);lasttitle.setText(bean.getLasttitle());TextView tv_lastmsgtime = (TextView)convertView.findViewById(_lastmsgtime);tv_lastmsgtime.setText(bean.getLastmsg_time());TextView tv_notrendmsgcount = (TextView)convertView.findViewById(_notrendmsgcount); tv_notrendmsgcount.setText(bean.getNoetrendmsg_count());return convertView;}}5.Avtivity代码public class QQMessageActivity extends AppCompatActivity {private ListView lvMessage;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_qqmessage);lvMessage = (ListView)findViewById(R.id.lvMessage);List<QQMsgBean> data = getData(); //获取数据集合lvMessage.setAdapter(new QQMsgAdapter(data,this)); //把数据集合塞到适配器⾥⾯适配}public static List<QQMsgBean> getData(){}//获取数据集合的⽅法}。

Android适配器(Adapter)的概念与自定义

Android适配器(Adapter)的概念与自定义

Android适配器(Adapter)的概念与⾃定义⽬录⼀、什么是适配器⼆、Adapter基本概念和继承关系三、⾃定义适配器实例1.⽂件结构2.xml内容3.java内容四、参考资料总结⼀、什么是适配器在常见软件中,往往能看到列表⼀样的信息流,例如:如果在xml中将信息写死,那显然是不合适的,⽆法做到上拉刷新的效果。

这个时候,就需要⽤到适配器。

Android中有很多的适配器,⾸先看看这些适配器的继承结构这些适配器中,BaseAdapter⽤的最多,也⽤的最熟⼆、Adapter基本概念和继承关系三、⾃定义适配器实例1.⽂件结构2.xml内容main.xml:<?xml version="1.0" encoding="utf-8"?><ListView xmlns:android="/apk/res/android"android:id="@+id/listview"android:layout_height="match_parent"android:layout_width="match_parent"android:orientation="vertical"></ListView>listview_item.xml:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="100dp"android:gravity="center_vertical"android:orientation="horizontal"android:padding="15dp"><ImageViewandroid:id="@+id/img_icon"android:layout_width="130dp"android:layout_height="80dp"android:src="@mipmap/news"/><RelativeLayoutandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_weight="1"><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:text="我是⼀个新闻标题---- 1"android:textColor="#000000"android:textSize="18dp" /><TextViewandroid:id="@+id/tv_content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:text="我是新闻内容---- 1"android:textColor="#000000"android:textSize="14dp" /></RelativeLayout></LinearLayout>3.java内容MainActivitypackage .cdut.testadapter;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.Toast;import java.util.LinkedList;import java.util.List;public class MainActivity extends AppCompatActivity {private List<News> mData = null;private Context mContext;private NewsAdapter mAdapter = null;private ListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);mContext = this;listView = (ListView) findViewById(R.id.listview);mData = new LinkedList<News>();for (int i = 0; i < 10; i++) {mData.add(new News("我是⼀个新闻标题---- " + i, "我是⼀个新闻内容---- " + i, R.mipmap.news)); }mAdapter = new NewsAdapter(mData, mContext);listView.setAdapter(mAdapter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, intposition, long id) {Toast.makeText(mContext, "点击了第" + position + "条数据",Toast.LENGTH_SHORT).show();}});}}News.javapackage .cdut.testadapter;public class News {private String title;private String content;private int aIcon;public News() {}public News(String title, String content, int aIcon) {this.title = title;this.content = content;this.aIcon = aIcon;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public int getaIcon() {return aIcon;}public void setaIcon(int aIcon) {this.aIcon = aIcon;}}NewsAdapterpackage .cdut.testadapter;import android.content.Context;import youtInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import java.util.List;public class NewsAdapter extends BaseAdapter {private List<News> mData;private Context mContext;public NewsAdapter(List<News> mData, Context mContext) {this.mData = mData;this.mContext = mContext;}@Overridepublic int getCount() {return mData.size();}@Overridepublic Object getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) { convertView =LayoutInflater.from(mContext).inflate(yout.listview_item,parent, false);ImageView img_icon = (ImageView)convertView.findViewById(R.id.img_icon);TextView title = (TextView)convertView.findViewById(_title);TextView content = (TextView)convertView.findViewById(_content);img_icon.setBackgroundResource(mData.get(position).getaIcon()); title.setText(mData.get(position).getTitle());content.setText(mData.get(position).getContent());return convertView;}}四、参考资料总结到此这篇关于Android适配器(Adapter)的概念与⾃定义的⽂章就介绍到这了,更多相关Android适配器Adapter内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

BaseAdapter详细解释

BaseAdapter详细解释

BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter,1、Adapter类简介1)、Adapter相关类结构如下图所示:自定义Adapter子类,就需要实现上面几个方法,其中最重要的是getView()方法,它是将获取数据后的View组件返回,如ListView中每一行里的TextView、Gallery中的每个ImageView。

2)、Adapter在Android应用程序中起着非常重要的作用,应用也非常广泛,它可看作是数据源和UI组件之间的桥梁,其中Adapter、数据和UI之间的关系,可以用下图表示:3)、常用子类2、BaseAdapter简介BaseAdapter是实现了ListAdapter和SpinnerAdapter两个接口,当然它也可以直接给ListView和Spinner等UI组件直接提供数据。

相关类结构如下图所示:3、示例示例一:Gallery显示一组图片运行结果:说明:上面一行图片是Gallery画廊,每次点击一个Gallery图片时,会同时在下面以大图形式显示出来该图片布局文件:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/a pk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/><Galleryandroid:id="@+id/gallery1"android:layout_width="match_parent"android:spacing="5px"android:layout_height="wrap_content"></Gallery><ImageViewandroid:id="@+id/iv"android:layout_gravity="center_vertical"android:layout_marginTop="20px"android:layout_width="320px"android:layout_height="320px"></ImageView></LinearLayout>MainActivity类:package com.magc.adapter;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Gallery;import android.widget.ImageView;import android.widget.AdapterView.OnItemClickListener;public class MainActivity extends Activity {private Gallery gallery;private ImageView imgview;private int[] imgs = {R.drawable.a6,R.drawable.a1,R.dra wable.a2,R.drawable.a3,R.drawable.a4,R.drawable.a5};/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(yout.main);imgview = (ImageView)findViewById(R.id.iv);gallery = (Gallery)findViewById(R.id.gallery1);MyImgAdapter adapter = new MyImgAdapter(this);gallery.setAdapter(adapter);gallery.setOnItemClickListener(new OnItemClickListe ner() {//用户点击图片时,将该图片的ResourceID设到下面的ImageView中去,@Overridepublic void onItemClick(AdapterView<?> arg0, Vie w view, int position,long arg3) {imgview.setImageResource(imgs[position]);}});}class MyImgAdapter extends BaseAdapter {//自定义图片Adapter以内部类形式存在于MainActivity中,方便访问MainActivity中的各个变量,特别是imgs数组private Context context;//用于接收传递过来的Contex t对象public MyImgAdapter(Context context) {super();this.context = context;}/* (non-Javadoc)* @see android.widget.Adapter#getCount()*/@Overridepublic int getCount() {return imgs.length;}/* (non-Javadoc)* @see android.widget.Adapter#getItem(int)*/@Overridepublic Object getItem(int position) {return position;}/* (non-Javadoc)* @see android.widget.Adapter#getItemId(int)*/@Overridepublic long getItemId(int position) {return position;}/* (non-Javadoc)* @see android.widget.Adapter#getView(int, andr oid.view.View, android.view.ViewGroup)*/@Overridepublic View getView(int position, View convertVi ew, ViewGroup parent) {//针对每一个数据(即每一个图片ID)创建一个ImageVie w实例,ImageView iv = new ImageView(context);//针对外面传递过来的Context变量,iv.setImageResource(imgs[position]);Log.i("magc", String.valueOf(imgs[positio n]));iv.setLayoutParams(new youtParams(80, 80));//设置Gallery中每一个图片的大小为80*80。

baseadapter常用的方法

baseadapter常用的方法

baseadapter常用的方法BaseAdapter是Android中常用的一种适配器,主要用于将数据与布局文件进行绑定,创建自定义的ListView、GridView等控件。

BaseAdapter类是一个抽象类,其中包含了许多方法用于实现适配器功能。

接下来将介绍BaseAdapter类中常用的方法,帮助我们更好地了解和使用这个类。

1. getCount()该方法用于返回数据总数,即ListView中子项的总数。

如果我们有10个联系人,则该方法应返回10。

2. getItem(int position)该方法用于返回在特定位置的数据项。

如果我们要获取第三个联系人,我们可以调用getItem(2)。

3. getItemId(int position)该方法用于返回某个位置的数据项的ID。

在ListView中,每个子项都必须有一个唯一的ID,该方法可用于获取该ID。

4. getView(int position, View convertView, ViewGroup parent)该方法用于返回每个子项的视图,即将布局文件与数据进行绑定。

参数position表示要获取的子项的位置,convertView表示已经存在的视图(用于重用),parent表示该子项所在的父容器。

如果convertView为空,我们可以通过LayoutInflater来获取一个新的视图,并将该视图与相应的数据进行绑定。

5. getItemViewType(int position)该方法用于返回每个子项的类型,用于支持多种布局。

如果我们在ListView中使用了多种布局文件,我们可以重写该方法来返回不同的类型。

如果列表中有两种不同的子项(文字和图像),我们可以分别返回0和1。

6. getViewTypeCount()该方法用于返回不同的子项类型数。

在我们使用多种布局文件时,应重写该方法并返回使用的布局文件数。

7. hasStableIds()该方法用于表示该适配器的数据集是否有稳定的ID。

Android中如何重写BaseAdapter以及对ListView的优化

Android中如何重写BaseAdapter以及对ListView的优化
return item; }
ListView 优化
通过缓存 convertView,这种利用缓存 contentView 的方式可以判断如果缓存中不存在 View 才创建 View,如果已经存在可以利用缓存中的 View,提升了性能。
public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = mInflater.inflate(yout.list_Adapter 以及对 ListView 的优化
背景
对于 ListView、GridView、Gallery、Spinner 等等,它是它们的适配器,直接继承自接口类 Adapter 的,使用 BaseAdapter 时需要重写很多方法,其中最重要的当属 getView,因为这 会涉及到 ListView 优化等问题,BaseAdapter 与其他 Adapter 有些不一样,其他的 Adapter 可以直接在其构造方法中进行数据的设置:
ImageView img = (ImageView)convertView.findViewById(R.id.img) TextView title = (TextView)convertView.findViewById(R.id.title); TextView info = (TextView)ConvertView.findViewById(); img.setImageResource(R.drawable.ic_launcher); title.setText("Hello"); info.setText("world");

Android中ListView,BaseAdapter,CursorAdapter等的简单总结

Android中ListView,BaseAdapter,CursorAdapter等的简单总结

Android中ListView,BaseAdapter,CursorAdapter等的简单总结ListView由复杂到简单 项⽬做完了,其中⽤到的ListView控件很⼤,有⾃由的时间就总结⼀下ListView的各个知识点。

谈到ListView总是离不开adapter的使⽤,在这⽚⽂章中也总结下adapter的使⽤,主要讲述两个adapter吧,baseadapter和cursoradapter的使⽤。

这俩是使⽤频率最多的adapter。

当然还有⽤系统的adapter,但这个较简单。

到⽂章最后再举⼏个更复杂的ListView的例⼦,作为扩展内容。

⼀.在xmlListView应设置为 <ListView android:id="@+id/list_goods" android:layout_width="fill_parent" android:layout_height="wrap_content" />。

主要就是宽度填满,⾼度⾃适应。

还有很多很实⽤的属性: android:cacheColorHint="#00000000" :ListView上下拖动的时候会出现⿊框,如下图所⽰。

设置左边的属性就可完美解决,当然在代码中也设置该属性(不推荐). android:divider="#000000" 该属性是⽤来设置ListView 间隔线的颜⾊。

很实⽤ android:dividerHeight="1px" ⽤来设置间隔线的⾼度,要设置的话⼀般就是1px,能看出来颜⾊就OK啦。

Android中有很多xml属性可以完美解决的事情,譬如在manifest⽂件的activity标签中设置android:theme="@android:style/Theme.NoTitleBar",就可隐藏标题。

Android中各种Adapter的介绍及使用

Android中各种Adapter的介绍及使用

Android中各种Adapter的介绍及使⽤最近在研究android,遇到很多问题,对于⽼鸟来说,这些问题可能都不⾜挂齿,可对于我来说这些⼩⼩的错误都是我不断进步的象征,嘻嘻。

其实,还真是有点享受这种学习、探索新技术的感觉,现在⼀遇到问题都知道查资料,仔细看错误⽇志,然后那些⼩问题就被我⼀个个击垮了。

等到⼀有时间就把⾃⼰犯下的错记录下来,总结解决⽅案,很好呵~对于android,了解最多的就是⼀些界⾯控件,但很多界⾯上的数据的加载⼀直都是添的死数据,遇到⼀些⽤adapter来给数据的时候⼀点不是很理解,所以,我想这个adapter肯定有⼤知识在⾥⾯,需要等⾃⼰去摸索它功能之强⼤,结合⾃⼰做的⼀些案例对adapter做⼀些⼩结.Android是⼀个完全遵循MVC模式设计的框架,Activity是C,Layout是V,Adapter是M 做完⼏个例⼦不难发现,我们的android界⾯上显⽰的数据很多情况下是借助adapter完成的。

Adapter是数据和ui界⾯之间的桥梁,它把后台数据与前端客户端界⾯连接起来,它是⼀个展⽰数据的载体。

详细的adapter结构、层级请查看api。

Android中常⽤的adapter有:BaseAdapter:基础适配器,android BaseAdapter实现了ListAdapter和SpinnerAdapter的接⼝,GridView的适配器有实现了ListAdapter,所以,BaseAdapter对于Spinner、ListView、GridView是通⽤的。

BaseAdapter是⼀个抽象类,继承它的类要实现很多⽅法。

ArrayAdapter:ArrayAdapter是BaseAdapter的之类,从BaseAdapter派⽣出来,它有BaseAdapter的所以功能。

但是,ArrayAdapter可以直接使⽤泛型结构。

ArryAdapter⽐较简单,只能显⽰⼀⾏⽂本。

Android必学之数据适配器BaseAdapter

Android必学之数据适配器BaseAdapter

Android必学之数据适配器BaseAdapter.什么是数据适配器?下图展⽰了数据源、适配器、ListView等数据展⽰控件之间的关系。

我们知道,数据源是各种各样的,⽽ListView所展⽰数据的格式则是有⼀定的要求的。

数据适配器正是建⽴了数据源与ListView之间的适配关系,将数据源转换为ListView能够显⽰的数据格式,从⽽将数据的来源与数据的显⽰进⾏解耦,降低程序的耦合性。

这也体现了Android的适配器模式的使⽤。

对于ListView、GridView等数据展⽰控件有多种数据适配器,本⽂讲解最通⽤的数据适配器——BaseAdapter。

.ListView的显⽰与缓存机制我们知道,ListView、GridView等控件可以展⽰⼤量的数据信息。

假如下图中的ListView可以展⽰100条信息,但是屏幕的尺⼨是有限的,⼀屏幕只能显⽰下图中的7条。

当向上滑动ListView的时候,item1被滑出了屏幕区域,那么系统就会将item1回收到Recycler中,即View缓冲池中,⽽将要显⽰的item8则会从缓存池中取出布局⽂件,并重新设置好item8需要显⽰的数据,并放⼊需要显⽰的位置。

这就是ListView的缓冲机制,总结起来就是⼀句话:需要时才显⽰,显⽰完就被会收到缓存。

ListView,GridView等数据显⽰控件通过这种缓存机制可以极⼤的节省系统资源。

.BaseAdapter使⽤BaseAdapter⽐较简单,主要是通过继承此类来实现BaseAdapter的四个⽅法:public int getCount():适配器中数据集的数据个数;public Object getItem(int position):获取数据集中与索引对应的数据项;public long getItemId(int position):获取指定⾏对应的ID;public View getView(int position,View convertView,ViewGroup parent):获取没⼀⾏Item的显⽰内容。

android adapter用法

android adapter用法

android adapter用法在Android开发中,Adapter是一个非常重要的概念,它被用于将数据项与视图进行绑定,从而在列表或者网格等控件上展示数据。

Adapter的主要作用是将数据转换为可视化的布局,并负责处理用户与数据之间的交互。

在Android中,常见的几种Adapter包括ArrayAdapter、BaseAdapter和RecyclerView.Adapter。

下面分别介绍它们的用法。

1. ArrayAdapter:ArrayAdapter是一个通用的适配器,用于将数组或List中的数据与ListView或Spinner等控件进行绑定。

使用它可以简化数据展示的过程。

下面是一个示例代码:```java//创建一个数据源String[] data = new String[]{"数据1", "数据2", "数据3"};//使用ArrayAdapter绑定数据到ListViewArrayAdapter<String> adapter = new ArrayAdapter<>(context, yout.simple_list_item_1, data);listView.setAdapter(adapter);```2. BaseAdapter:BaseAdapter是一个基础适配器,用于自定义数据项的展示和交互逻辑。

它需要我们重写一些方法来实现自定义的适配器。

下面是一个示例代码:```javapublic class MyAdapter extends BaseAdapter {private List<String> data;//其他成员变量和构造方法省略@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//加载布局、设置数据等操作省略return convertView;}}//使用自定义的AdapterMyAdapter adapter = new MyAdapter(data);listView.setAdapter(adapter);```3. RecyclerView.Adapter:RecyclerView.Adapter是用于RecyclerView控件的适配器,它相较于BaseAdapter更加强大和灵活。

Android中BaseAdapter的用法分析与理解

Android中BaseAdapter的用法分析与理解

Android中BaseAdapter的⽤法分析与理解本⽂实例分析了Android中BaseAdapter的⽤法。

分享给⼤家供⼤家参考,具体如下:最近做⼀个项⽬,项⽬中⽤到了ListView,ListView最重要的就是绑定数据,这个数据由Adapter来提供,这⾥我重写了BaseAdapter这个类来实现⾃⼰的menuAdapter代码如下:package norder;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.leepood.xmlparse.xmlParse;import youtInflater;import android.content.Context;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class menuAdapter extends BaseAdapter {private LayoutInflatermInflater;private Context context;privateList<Menu> menus;publicmenuAdapter(List<Menu> menus,Context context) {this.menus=menus;this.mInflater =LayoutInflater.from(context);}public int getCount() {return menus.size();}public Object getItem(intposition) {return menus.get(position);}public long getItemId(intposition) {return position;}public View getView(intposition, View convertView, ViewGroup parent) {menuAdapterViewholder = null;//⾃定义的⼀个类⽤来缓存convertviewif (convertView ==null) {holder=newmenuAdapterView();convertView =mInflater.inflate(yout.menu, null); =(TextView)convertView.findViewById(R.id.txtname);holder.price =(TextView)convertView.findViewById(R.id.txtprice);holder.description =(TextView)convertView.findViewById(R.id.txtdescription);convertView.setTag(holder);//Log.i("tag", "run once");}else {holder = (menuAdapterView)convertView.getTag();}.setText(String.valueOf(position));holder.price.setText((String)menus.get(position).getPrice());holder.description.setText((String)menus.get(position).getDescription());return convertView;}}其中BaseAdapter需要重写的⽅法:getCount(),getItem(int position),getItemId(int position),getView(int position, View convertView, ViewGroup parent)流程分析:listView在开始绘制的时候,系统⾸先调⽤getCount()函数,根据他的返回值得到 listView的长度,然后根据这个长度,调⽤getView()逐⼀绘制每⼀⾏。

Android 说说Adapter的几个方法

Android 说说Adapter的几个方法

Android 说说Adapter的几个方法Android的Adapter是连接后端数据和前端显示的适配器接口,他有多种抽象类,在使用Gallery 时候,我们继承的BaseAdapter就是他的一个子类.要实现BaseAdapter这个子类,我们要实现它的四个方法,Java代码1publicintgetCount()23publicObjectgetItem(intposition)45publiclonggetItemId(intposition)67publicViewgetView(intposition,ViewconvertView,ViewGroupparent)第一个方法和第四个方法比较好理解,第一个方法是返回我们后台一共有多少数据,最后一个方法是返回一个加载了数据的view,以便于前面控件的调用.那么第二个方法和第三个方法又是做什么用的呢?我们需要返回什么值呢?察看google的文档,他在Gallery这个类中实现了一个BaseAdapter的子类,如下所示:Java代码8publicclassImageAdapterextendsBaseAdapter{910intmGalleryItemBackground;1112privateContextmContext;1314privateInteger[]mImageIds={1516R.drawable.sample_1,1718R.drawable.sample_2,1920R.drawable.sample_3,2122R.drawable.sample_4,2324R.drawable.sample_5,2526R.drawable.sample_6,2728R.drawable.sample_7};2930publicImageAdapter(Contextc){3132mContext=c;3334TypedArraya=obtainStyledAttributes(R.styleable.HelloGallery);3536mGalleryItemBackground=a.getResourceId(3738R.styleable.HelloGallery_android_galleryItemBackground,0);3940 a.recycle();4142}4344publicintgetCount(){4546returnmImageIds.length;4748}4950publicObjectgetItem(intposition){5152returnposition;5354}5556publiclonggetItemId(intposition){5758returnposition;5960}6162publicViewgetView(intposition,ViewconvertView,ViewGroupparent){6364ImageViewi=newImageView(mContext);6566i.setImageResource(mImageIds[position]);6768i.setLayoutParams(youtParams(150,100));6970i.setScaleType(ImageView.ScaleType.FIT_XY);i.setBackgroundResource(mGalleryItem Background);returni;7172}7374}里面的getItem 和getItemId这两个方法统统地返回position这个变量,很奇怪的两个方法,尤其是getItem,不是要返回Object吗?怎么返回了一个数字了?虽然数字也是一个Object,但是很明显这个方法看起来不是要返回一个数字的.那么我们就来看源代码吧,BaseAdapter继承了SpinnerAdapter ,我们在SpinnerAdapter中去找这个方法的调用,没找到.BaseAdapter还继承了ListAdapter,我们去找,还是没有找到.既然都没有找到,那么这两个方法只能是适用这个Adapter的View来调用的,察看Gallery这个类,发现他继承了AbsSpinner,而AbsSpinner继承了AdapterView,在AdapterView类中,我们找到了如下的两个方法,Java代码75publicObjectgetItemAtPosition(intposition){7677Tadapter=getAdapter();7879return(adapter==null||position<0)?null:adapter.getItem(position);8081}8283publiclonggetItemIdAtPosition(intposition){8485Tadapter=getAdapter();8687return(adapter==null||position<0)?INV ALID_ROW_ID:adapter.getItemId(position);8889}这两个方法是public的方法,说明我们可以直接调用Gallery的这两个方法的,那么AdapterView中有没有调用这两个方法呢?经过察看源代码发现, public Object getItemAtPosition(int position)这个方法单纯是为我们调用的,android在源码中没有调用这方法public long getItemIdAtPosition(int position)这个方法会设置mNextSelectedRowId这个变量,而这个变量的设置好以后android也并没有去取用,只提供了一个公共方法public long getSelectedItemId() { return mNextSelectedRowId; }来返回这个变量。

Adapter模式在Android中的应用

Adapter模式在Android中的应用

Adapter模式在Android中的应用在Android程序开发中,Adapter模式是常用的一种设计模式。

Adapter模式用于将一个类的接口转换成客户希望的另一个接口。

这种模式主要适用于那些原本不兼容的类之间的接口转换。

在Android中,Adapter模式主要用于ListView、RecyclerView等控件中,将数据源和界面进行绑定。

ListView是Android中比较常用的控件之一,它可以用来显示一组滚动的数据列表。

ListView可以显示的数据通常来自于一个List或者一个数组,这些数据源需要通过适配器(Adapter)来连接到ListView上。

Adapter把数据源和ListView连接起来,并根据ListView的要求,提供ListView需要的数据和组件,负责将组件和数据绑定。

Adapter模式正是这个流程的精髓所在。

在实际开发过程中,我们常常需要对ListView中的每个Item进行设计。

比如需要在每个Item中放置一张图片,一段文字等等。

Adapter模式可以将数据和UI组件分离,使UI组件不需要知道数据是从哪里来的。

Adapter负责数据的处理,而UI组件则根据Adapter提供的数据进行渲染。

Android中提供了两个重要的Adapter类:ArrayAdapter和BaseAdapter。

ArrayAdapter是一个简单的Adapter,可以用来处理数据类型比较简单的情况,比如只需要显示一些字符串。

BaseAdapter则是一个更加通用的Adapter,可以用来处理复杂的UI组件以及数据源之间的关系。

BaseAdapter需要程序员实现其中的一些方法,来实现数据和UI绑定的过程。

除此之外,在Android中还有一个RecyclerView控件。

RecyclerView是一个更加高级的RecyclerView,它比ListView可以处理更加复杂的UI组件。

RecyclerView始终是基于Adapter模式来实现的,它需要一个Adapter类来将数据源和UI组件连接起来。

android adapter用法

android adapter用法

android adapter用法Android Adapter是Android开发中常用的一种组件,它用于在用户界面(UI)和数据源之间建立连接。

Adapter的主要作用是将数据源转换为适合显示在UI上的视图。

通过使用Adapter,开发者可以轻松地在Android应用程序中展示复杂的数据。

一、Adapter的作用Adapter在Android应用开发中扮演了重要的角色。

它的主要作用可以总结为以下几点:1. 数据和UI的桥梁:Adapter负责将数据源与UI控件进行绑定,将数据源中的数据转换为可以在UI上展示的视图。

2. 数据的适配:Adapter可以根据不同的需求对数据进行适配和处理,满足UI展示的要求。

例如,当数据源中的数据过多时,Adapter 可以实现分页加载,提高性能和用户体验。

3. 响应用户操作:Adapter可以监听用户的交互操作,例如点击、长按等,根据用户的操作响应相应的事件。

4. 数据的更新和刷新:Adapter可以实现数据的更新和刷新,保证数据的及时展示和同步。

二、Adapter的种类在Android开发中,有多种类型的Adapter可供选择,开发者可以根据自己的需求选择适合的Adapter。

1. ArrayAdapter:用于将数组或列表中的数据与ListView等UI控件进行绑定。

2. BaseAdapter:是一个通用的Adapter类,可以根据需求自定义实现适配器。

3. CursorAdapter:用于将数据库查询结果与ListView等UI控件进行绑定。

4. SimpleAdapter:用于将Map对象与ListView等UI控件进行绑定。

5. RecyclerView.Adapter:是用于将数据与RecyclerView进行绑定的Adapter,它在Android最新的支持库中引入。

6. PagerAdapter:用于将数据与ViewPager进行绑定,实现页面切换效果。

adapter用法

adapter用法

adapter用法Adapter(适配器)是一种常用的设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。

通过使用适配器,可以让那些原本由于接口不兼容而无法一起工作的类能够协同工作。

在软件开发中,适配器模式可以应用在多种场景中,从UI界面的适配到数据库的适配等等。

本文将介绍适配器的常见用法,并给出相关的参考内容,帮助读者更好地理解和应用适配器模式。

1. 接口适配器模式:有时候,我们需要在一个接口中实现多个方法,但是某些类并不需要实现所有方法,此时可以使用接口适配器模式。

接口适配器模式通过提供一个抽象类来实现接口,然后具体的类继承抽象类并只实现其中需要的方法。

这样,具体的类就可以选择性地实现接口中的方法,而不需要实现所有方法。

参考内容:- 《设计模式:可复用面向对象软件的基础》- 《精通设计模式:面向对象的软件构建》2. 类适配器模式:类适配器模式通过继承实现适配器,将需要适配的类作为父类,然后通过子类实现父类接口的方式来实现适配。

通过类适配器模式,我们可以复用已有的代码,同时实现接口的兼容性。

参考内容:- 《Head First 设计模式》- 《深入浅出设计模式》3. 对象适配器模式:对象适配器模式通过组合实现适配器,将需要适配的类作为一个成员变量,然后通过提供一个与目标接口一致的方法来实现适配。

对象适配器模式比类适配器模式更灵活,因为它可以适配多个类,而不仅仅是一个父类。

参考内容:- 《设计模式之禅》- 《大话设计模式》4. RecyclerView.Adapter:Android中的RecyclerView是一种高度可定制的列表控件,它需要通过一个适配器来提供数据和定义列表项的视图。

RecyclerView.Adapter是RecyclerView的适配器基类,我们可以继承该类来自定义列表项的布局和数据绑定等操作。

参考内容:- 《Android开发艺术探索》- 《第一行代码》5. ArrayAdapter:Android中的ArrayAdapter是一个简单的适配器实现,它可以将一个数组或List中的数据提供给ListView、Spinner等控件使用。

Android基础入门教程——2.4.7构建一个可复用的自定义BaseAdapter-电脑资料

Android基础入门教程——2.4.7构建一个可复用的自定义BaseAdapter-电脑资料

Android基础入门教程——2.4.7构建一个可复用的自定义BaseAdapter-电脑资料Android基础入门教程——2.4.7 构建一个可复用的自定义BaseAdapter标签(空格分隔): Android基础入门教程本节引言:如题,本节给大家带来的是构建一个可复用的自定义BaseAdapter,我们每每涉及到ListViewGridView等其他的Adapter控件,都需要自己另外写一个BaseAdapter类,这样显得非常麻烦,又比如,我们想在一个界面显示两个ListView的话,我们也是需要些两个BaseAdapter…这,程序员都是喜欢偷懒的哈,这节我们就来写一个可复用的自定义BaseAdapter类~1.我们一点点开始改:首先我们把上节写的自定义BaseAdapter贴下,等下我们就要对他进行升级改造<code class="language-Java" hljs="" java="">/** * Created by Jay on 2015/9/21 0021. */public class MyAdapter extends BaseAdapter { private Context mContext; private LinkedList<data>mData; public MyAdapter() { } public MyAdapter(LinkedList<data>mData, Context mContext) { this.mData = mData; this.mContext = mContext; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public longgetItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(yout.item_list,parent, false); holder = new ViewHolder(); holder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);holder.txt_content = (TextView) convertView.findViewById(R.id.txt_content); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.img_icon.setImageResource(mData.get(position).getImgId());holder.txt_content.setText(mData.get(position).getContent()); return convertView; } //添加一个元素 public voidadd(Data data) { if (mData == null) { mData = new LinkedList<>(); } mData.add(data); notifyDataSetChanged(); } //往特定位置,添加一个元素public void add(int position,Data data){ if (mData == null){ mData = new LinkedList<>(); } mData.add(position, data); notifyDataSetChanged(); } public void remove(Data data) { if(mData != null){ mData.remove(data); } notifyDataSetChanged(); } public void remove(int position){ if(mData != null) { mData.remove(position); } notifyDataSetChanged(); } public void clear(){ if(mData != null) { mData.clear(); } notifyDataSetChanged(); } private class ViewHolder{ ImageView img_icon; TextViewtxt_content; }}</data></data></code>升级1:将Entity设置成泛型好的,毕竟我们传递过来的Entitiy实体类可能千奇百怪,比如有Person,Book,Wether等,所以我们将Entity设置成泛型,修改后的代码如下:<code class="language-Java" cs="" hljs="">public class MyAdapter<t>extends BaseAdapter { private Context mContext; private LinkedList<t>mData; public MyAdapter() { } public MyAdapter(LinkedList<t>mData, Context mContext) { this.mData = mData; this.mContext = mContext; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(yout.item_list,parent, false); holder = new ViewHolder(); holder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);holder.txt_content = (TextView) convertView.findViewById(R.id.txt_content); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.img_icon.setImageResource(mData.get(position).getImgId());holder.txt_content.setText(mData.get(position).getContent()); return convertView; } //添加一个元素 public void add(T data) { if (mData == null) { mData = new LinkedList<>(); } mData.add(data); notifyDataSetChanged(); } //往特定位置,添加一个元素public void add(int position,T data){ if (mData == null) { mData = new LinkedList<>(); } mData.add(position, data); notifyDataSetChanged(); } public void remove(T data) { if(mData != null) { mData.remove(data); } notifyDataSetChanged(); } public void remove(int position) { if(mData != null) { mData.remove(position); } notifyDataSetChanged(); } public void clear() { if(mData != null) { mData.clear(); } notifyDataSetChanged(); } private class ViewHolder { ImageView img_icon; TextViewtxt_content; }}</t></t></t></code>好的,上面我们做的事仅仅是将Data类型换成了泛型T!升级2:ViewHolder类的升级改造:我们先来看看前面我们的ViewHolder干了什么?答:findViewById,设置控件状态;下面我们想在完成这个基础上,将getView()方法大部分的逻辑写到ViewHolder类里,这个ViewHolder要做的事:定义一个查找控件的方法,我们的思路是通过暴露公共的方法,调用方法时传递过来控件id,以及设置的内容,比如TextView设置文本:public ViewHolder setText(int id, CharSequence text){文本设置} 将convertView复用部分搬到这里,那就需要传递一个context对象了,我们把需要获取的部分都写到构造方法中!写一堆设置方法(public),比如设置文字大小颜色,图片背景等!好的,接下来我们就来一步步改造我们的ViewHolder类1)相关参数与构造方法:<code class="language-Java" cs="" hljs="">public staticclass ViewHolder { private SparseArray<view>mViews; //存储ListView 的 item中的View private View item; //存放convertView private int position; //游标private Context context; //Context上下文 //构造方法,完成相关初始化 private ViewHolder(Context context, ViewGroup parent, int layoutRes) { mViews = new SparseArray<>(); this.context = context; View convertView = LayoutInflater.from(context).inflate(layoutRes,parent,false); convertView.setTag(this); item = convertView; } ImageView img_icon; TextViewtxt_content; }</view></code>2)绑定ViewHolder与Item在上面的基础上我们再添加一个绑定的方法<code class="language-Java" cs="" hljs="">//绑定ViewHolder与item public static ViewHolder bind(Contextcontext, View convertView, ViewGroup parent, int layoutRes, int position) { ViewHolder holder;if(convertView == null) { holder = new ViewHolder(context, parent, layoutRes); } else{ holder = (ViewHolder) convertView.getTag(); holder.item = convertView; } holder.position =position; return holder; }</code>3)根据id获取集合中保存的控件<code applescript="" class="language-Java"hljs="">public<t extends="" view="">T getView(int id){ T t = (T) mViews.get(id); if(t == null) { t= (T) item.findViewById(id); mViews.put(id, t); } return t; }</t></code>4) 接着我们再定义一堆暴露出来的方法<code class="language-Java" hljs="" java="">/** *获取当前条目 */ public View getItemView() { return item; } /** * 获取条目位置 */ public int getItemPosition() { return position; } /** *设置文字*/ public ViewHolder setText(int id, CharSequence text) { View view = getView(id); if(view instanceof TextView) { ((TextView) view).setText(text); } return this; } /** * 设置图片 */ public ViewHolder setImageResource(intid, int drawableRes) { View view = getView(id); if(view instanceof ImageView) { ((ImageView) view).setImageResource(drawableRes); } else{ view.setBackgroundResource(drawableRes); } return this; } /** * 设置点击监听 */ public ViewHolder setOnClickListener(int id, View.OnClickListener listener) { getView(id).setOnClickListener(listener); return this; } /** * 设置可见 */ public ViewHolder setVisibility(int id, int visible){ getView(id).setVisibility(visible); return this; } /** * 设置标签 */ public ViewHolder setTag(int id, Object obj) { getView(id).setTag(obj); return this; } //其他方法可自行扩展</code>好的,ViewHolder的改造升级完成~升级3:定义一个抽象方法,完成ViewHolder与Data数据集的绑定<code class="language-Java" cs="" hljs="">public abstract void bindView(ViewHolder holder, T obj);</code> 我们创建新的BaseAdapter的时候,实现这个方法就好,另外,别忘了把我们自定义的BaseAdapter改成abstact抽象的!升级4:修改getView()部分的内容<code class="language-Java" hljs="" java="">@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, mLayoutRes , position); bindView(holder,getItem(position)); return holder.getItemView(); }</code>2.升级完毕,我们写代码来体验下:我们要实现的效果图:就是上面有两个列表,布局不一样,但是我只使用一个BaseAdapter类来完成上述效果!关键代码如下:MainActivity.java:<code class="language-Java" hljs="" java="">public class MainActivity extends AppCompatActivity { private Context mContext; private ListView list_book; private ListView list_app; private MyAdapter myAdapter1 = null; private MyAdapter<b>myAdapter2 = null; private ArrayListmData1 = null; private ArrayList<b>mData2 = null;@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.activity_main); mContext = MainActivity.this; init(); } private void init(){ list_book = (ListView) findViewById(R.id.list_book);list_app = (ListView) findViewById(R.id.list_app); //数据初始化 mData1 = new ArrayList(); mData1.add(newApp(R.mipmap.iv_icon_baidu,百度)); mData1.add(newApp(R.mipmap.iv_icon_douban,豆瓣)); mData1.add(newApp(R.mipmap.iv_icon_zhifubao,支付宝)); mData2 = new ArrayList<b>(); mData2.add(new Book(《第一行代码Android》,郭霖)); mData2.add(new Book(《Android群英传》,徐宜生)); mData2.add(new Book(《Android开发艺术探索》,任玉刚)); //Adapter初始化 myAdapter1 = new MyAdapter(mData1,yout.item_one) { @Override public void bindView(ViewHolder holder, App obj){ holder.setImageResource(R.id.img_icon,obj.getaIcon());holder.setText(R.id.txt_aname,obj.getaName()); } }; myAdapter2 = new MyAdapter<b>(mData2,yout.item_two) { @Override public void bindView(ViewHolder holder, Book obj){ holder.setText(R.id.txt_bname,obj.getbName()); holder.setText(R.id.txt_bauthor,obj.getbAuthor()); } };//ListView设置下Adapter:list_book.setAdapter(myAdapter2);list_app.setAdapter(myAdapter1); }}</book></book></book></book></code>我们写的可复用的BaseAdapter的使用就如上面所述~3.代码示例下载:ListViewDemo4.zip贴下最后写好的MyAdapter类吧,可根据自己的需求进行扩展:MyAdapter.java:<code class="hljs" cs="">/** * Created by Jay on 2015/9/22 0022. */public abstract class MyAdapter<t>extends BaseAdapter { private ArrayList<t>mData; private int mLayoutRes; //布局id public MyAdapter() { } public MyAdapter(ArrayList<t>mData, int mLayoutRes) { this.mData = mData; this.mLayoutRes = mLayoutRes; } @Override public int getCount() { return mData != null ? mData.size() : 0; } @Override public T getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, mLayoutRes , position); bindView(holder, getItem(position)); return holder.getItemView(); } public abstract void bindView(ViewHolder holder, T obj); //添加一个元素 public void add(T data) { if (mData == null) { mData = new ArrayList<>(); } mData.add(data); notifyDataSetChanged(); } //往特定位置,添加一个元素public void add(int position, T data) { if (mData == null) { mData = new ArrayList<>(); } mData.add(position, data); notifyDataSetChanged(); } public void remove(T data) { if (mData != null){ mData.remove(data); } notifyDataSetChanged(); } public void remove(int position){ if (mData != null) { mData.remove(position); } notifyDataSetChanged(); } public void clear() { if (mData != null) { mData.clear(); } notifyDataSetChanged(); } public static class ViewHolder{ private SparseArray<view>mViews; //存储ListView 的item中的View private View item; //存放convertView private int position; //游标 private Context context; //Context上下文 //构造方法,完成相关初始化private ViewHolder(Context context, ViewGroup parent, int layoutRes) { mViews = new SparseArray<>(); this.context = context; View convertView = LayoutInflater.from(context).inflate(layoutRes, parent, false); convertView.setTag(this); item = convertView; } //绑定ViewHolder与item public static ViewHolder bind(Context context, View convertView, ViewGroup parent, int layoutRes, int position) { ViewHolder holder; if (convertView== null) { holder = new ViewHolder(context, parent, layoutRes); } else { holder = (ViewHolder) convertView.getTag(); holder.item = convertView; } holder.position = position; return holder; } @SuppressWarnings(unchecked) public<t extends="" view="">T getView(int id) { T t = (T) mViews.get(id); if (t == null) { t = (T) item.findViewById(id); mViews.put(id, t); } return t; } /** * 获取当前条目 */ public View getItemView() { return item; } /** *获取条目位置*/ public int getItemPosition(){ return position; } /** * 设置文字 */ public ViewHolder setText(int id, CharSequence text){ View view = getView(id); if (view instanceof TextView) { ((TextView) view).setText(text); } return this; } /** * 设置图片 */ public ViewHolder setImageResource(int id, int drawableRes){ View view = getView(id); if (view instanceof ImageView) { ((ImageView) view).setImageResource(drawableRes); } else{ view.setBackgroundResource(drawableRes); } return this; } /** * 设置点击监听 */ public ViewHolder setOnClickListener(int id, View.OnClickListener listener) { getView(id).setOnClickListener(listener); return this; } /** * 设置可见 */ public ViewHolder setVisibility(int id, int visible){ getView(id).setVisibility(visible); return this; } /** * 设置标签 */ public ViewHolder setTag(int id, Object obj) { getView(id).setTag(obj); return this; } //其他方法可自行扩展 }}</t></view></t></t></t></code>。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android ListView理解,BaseAdapter
ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来。

一般而言,一个ListView由以下三个元素组成:1.View,用于展示列表,通常是一个xml所指定的。

大家都知道Android 的界面基本上是由xml文件负责完成的,所以ListView的界面也理所应当的使用了xml定义。

例如在ListView中经常用到的“yout.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方法。

相关文档
最新文档