android 适配器 BaseAdapter 的学习

昨天晚上看了下ArrayAdapter,和SimpleAdapter,今天早上起来看完了球赛,又继续要开始学习了,适配器除了前面的两种,还有一种常用的就是BaseAdapter,他是一个抽象类。事实上通过源码可以看到,ArayAadapter和SimpleAdapter 都是继承自BaseAdapter的,前面两种大多数只是对信息的显示,Simple能够对复杂的信息进行显示,而如果需要用到响应,就只能自定义适配器了。所以同样我们可以继承BaseAdapter来实现自定义适配器

一,实现自定义的MyAdapter

当继承自BaseAdapter之后,编译器会自动提示需要该类需要实现的方法,getCount(),getItem(),getItemId(),getView().只需要重载这些抽象方法,实现功能即可。下面是一个小demo ,用来绑定一个TextView  和一个Buttton。前三个重载函数都好理解,重点getView。第一个参数position应该是视图的索引,第二个参数刚开始不是很清楚,但是按照字面意思是转变view,看了下网上的大神教程。是将一个自定义layout转变成view,其中用到了LayoutInflater 这样一个类。实在看不懂继续百度,如下:

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

具体作用:

1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;

2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

这样的话,那就简单多了,只需要拿到view 取到控件,然后给控件设置值即可。

还有一点看的不是很明白,就是在获取view 的时候,先去判断convertView是否为null,如果为null那么就创建view。

首先去判断convertView是否为null,当其为null的时候,才去重新创建一个view,不是的话,就直接用convertView。那么这个convertView是什么东西呢?其实它就是刚刚离开屏幕的那个View,所以我们可以复用它,这样我们就可以极大极大地减少这个view的创建。

这一点,可以说极大地优化了这个listView的性能,尤其是我们在加载图片这种很耗内存的资源的时候,这个效果更加明显。 不过这还不够,因为获得这个view之后,每次还需要通过 view.findViewById 来获得view里面的控件,findViewById的成本也是非常之高的,那么有什么办法呢? 一般来说,就是ViewHolder的应用了。

我们可以在从view中获得的这几个控件放到一个viewHolder的对象中,并将其设置给view的Tag属性,这样下一次再重复利用这个view的时候,就不必再通过findViewById来获得控件 ,而是可以直接通过viewHolder来获得对应的控件。

同时也给button添加相应函数

public class MyAdapter extends BaseAdapter{
    private Context context;
    private List<String> list;
    private LayoutInflater mInflater;
    public MyAdapter(Context context,List<String> list){

        this.mInflater = LayoutInflater.from(context);
        this.context = context;
        this.list = list;
    }
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        TextView textView=null;
        Button btn=null;
        ViewHold viewHold =null;
        if(convertView==null){

            viewHold = new ViewHold();
            convertView = mInflater.inflate(R.layout.baseitemlayout,null);
            viewHold.textView = (TextView)convertView.findViewById(R.id.textView3);
            viewHold.btn = (Button)convertView.findViewById(R.id.button3);
            convertView.setTag(viewHold);
        }
        else{
            viewHold =(ViewHold) convertView.getTag();
        }
        viewHold.textView.setText(list.get(position));
        viewHold.btn.setText("按钮");
        viewHold.btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,"按钮",Toast.LENGTH_LONG).show();
            }
        });
        return convertView;
    }
    public class  ViewHold{
        public TextView textView;
        public Button btn;
    }
}
二 创建activity


public class BaseAdapterActivity extends Activity {

    private MyAdapter adapter;
    private List<String> list;
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_adapter);
        listView = (ListView)findViewById(R.id.listView4);
        list = new ArrayList<String>();
        adapter = new MyAdapter(this,getData());
        listView.setAdapter(adapter);
    }
    List<String> getData(){
        list.add("第一行");
        list.add("第二行");
        list.add("第三行");
        list.add("第四行");
        return list;
    }
}
 
为了弄明白,网上资料查了好多,不过还好总算是实现了。
时间: 2024-11-16 23:38:20

android 适配器 BaseAdapter 的学习的相关文章

Android 适配器BaseAdapter详解

public int getCount() 数据域大小方法 public Object getItem(int arg0) 返回每个Item的数据据 public long getItemId(int arg0) 返回每个Item的ID View getView(int arg0, View arg1, ViewGroup arg2) 最重要的是:重绘视图,调用次数是由第一个方法确定的.最后将视图返回. 注意:有些控件必须设置成没有获利焦点与点击. 这几个方法写的内容基本不变,具有参考价值. 2

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

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

android 适配器simpleadapter和baseadapter区别

android 适配器 simpleadapter 和 baseadapter 设计网络程序或者数据处理显示程序的时候,常常会使用 simpleadapter 和baseadapter 来实现. adapter 是适配器模式,是数据和界面之间的桥梁.baseadapter 是一个抽象的类,要使用必需为其定义子类并实现相关方法.simpleadapter 派生于 baseadapter ,已经实现了相关的方法,所以可以直接使用.二者在使用效果上没有太大的区别,两者可以设计出几乎一模一样的界面.但在

Android必学之数据适配器BaseAdapter

.什么是数据适配器? 下图展示了数据源.适配器.ListView等数据展示控件之间的关系.我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的.数据适配器正是建立了数据源与ListView之间的适配关系,将数据源转换为ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,降低程序的耦合性.这也体现了Android的适配器模式的使用.对于ListView.GridView等数据展示控件有多种数据适配器,本文讲解最通用的数据适配器——BaseAdap

Android适配器的使用(ArrayAdapter、SimpleAdapter、BaseAdapter)

目录 数组适配器ArrayAdapter 简单适配器SimpleAdapter 自定义适配器BaseAdapter 数组适配器ArrayAdapter 简介: ArrayAdapter是Android的列表适配器,用于ListView这类型的控件与数据之间适配用的.默认的ArrayAdapter期望接受的样式文件里只含有一个textview 使用方法:实现如下效果: XML布局: <LinearLayout xmlns:android="http://schemas.android.com

Android 适配器教程(一)

最近在开发安卓的过程中发现ListView无疑是一个经常使用的组件,而提到ListView又不得不提一下适配器了,我打算用几个实例,由浅入深的向大家仔细讲解一下适配器的使用,虽然这算不上什么高深的问题,我还是希望能给大家带来一些收获,我也是菜鸟一只,写的不好的或者有错的地方还请大家帮忙指出.下面进入正文: 首先让我们来认识一下适配器: 什么是适配器呢?顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示.适配器就像显示器,把复杂的东西按人可以接受的方式来展现.也可以这样来理解适配器,L

Android 适配器教程(五)

在之前四讲中,我们已经由浅入深的认识了适配器,从最简单的ListView写起,最后完成了自定义适配器的简单例子,这一次咱们就上次留下来的问题 再进行更加深入的学习,主要是getView方法的原理,还有Holder的使用,还有关于ListView性能方面的优化问题.自定义适配器这一部分需要好好的进行理解,只有真正理解的比较透彻,写起来才会比较顺手.这一次就没有例子了,我会配上几张图片,希望能让大家看得明白. 先从ListView的原理来进行讲解吧! 大家先看一张图: 这就是ListView的工作原

Android 适配器教程 (六)

我们的适配器学习已经接近尾声了,虽然这不是一个大问题,但是确实是值得学习的一块知识,回想一下之前五讲的知识,我们已经学到了很多东西了. 在之前五讲中,我们已经由浅入深的认识了适配器,从最简单的ListView写起,最后完成了自定义适配器的简单例子,然后又为大家讲解了ViewHolder和settag在自定义适配器中的应用,帮助大家理解了getView方法,还讲解了关于ListView性能方面的优化问题.自定义适配器这一部分是我们这次学习真正的重点,很多问题可以用安卓原生适配器进行解决,但是也有很

Android 适配器教程(三)

前两讲中,我们分别大体的了解了适配器是什么,和它的一些基本知识. 并且分别讲解了了ArrayAdapter和SimpleCursorAdapter这两种常用的安卓原生适配器,这两种适配器都是封装好了的,他们虽然使用起来非常简单,但是可扩展性较差. 现在我们继续向下深入学习安卓的适配器,这一次我们将会一同学习SimpleAdapter simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等