Android中ArrayAdapter、SimpleAdapter、BaseAdapter总结

因为经常忘记,总结一下之前学过的各种Adapter。

1. ArrayAdapter

构造函数

public ArrayAdapter (Context context, int resource, T[] objects)

Parameters

context: 上下文.

resource: 资源ID,该资源包含了一个TextView组件(The resource ID for a layout file containing a TextView to use when instantiating views).

objects :在ListView上要呈现的内容(The objects to represent in the ListView).

public class ArrayAdapterTest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.array_adapter);
        Toast.makeText(this, "button1 pressed!", 0).show();
        ListView ls=(ListView) this.findViewById(R.id.listView1);
        String arr[]=new String[]{"hello","world","arrayAdapter"};

        ArrayAdapter adapter=new ArrayAdapter(this,R.layout.array_adapter_item,arr);
        ls.setAdapter(adapter);

    }

2. SimpleAdapter

public SimpleAdapter (Context context, List<? extends Map<String, ?>>data, int resource, String[] from, int[] to)

Parameters

context : The context where the View associated with this

SimpleAdapter is running

data : A List of Maps. Each entry in the List corresponds to one row in the list. The Maps contain the data for each row, and should include all the entries specified in “from”

resource: Resource identifier of a view layout that defines the views

for this list item. The layout file should include at least those

named views defined in “to”

from : A list of column names that will be added to the Map associated with each item.

to : The views that should display column in the “from” parameter. These should all be TextViews. The first N views in this list are given the values of the first N columns in the from parameter.

for(int i=0;i<names.length;i++){
            Map<String,Object> map=new HashMap<String, Object>();
            map.put("name", names[i]);
            map.put("desc",desc[i]);
            map.put("image",imageIds[i]);
            listItem.add(map);
        }
        /*
        from参数中的内容为map中的key.set()
        */
        SimpleAdapter sa=new SimpleAdapter(this, listItem, R.layout.simple_adapter_item, new String[]{"name","desc","image"}, new int[]{R.id.name,R.id.desc,R.id.imageView1});
        ls.setAdapter(sa);

3. 自定义Adapter

简述下其中原理性的东西:

(0) ButterKnifed的框架 : 关于ButterKnife的基础知识可以参考我之前的博客,这里相当于补充其在ViewHolder中的应用

http://blog.csdn.net/csp277/article/details/46787691

(1)setTag的作用 : 就是为了通过对holder的引用,实现缓存后继续试用holder避免了每个页面的每一条item都重新定义holder并获取对应物理组件。

实现原理

a.java中如果一个对象存在实引用,则JVM不能回收该对象

b.ListView有个循环机制,只有手机显示屏所能够呈现的(容纳的)item(即第一页的items) 是需要新建View的,为了达到高效,当往下划时,Android复用了之前建好的view(convertView),也就是说不用再new

c.结合到一起,当listView向下滑动时,系统复用之前产生的convertView ,从而可以将携带的Tag,即holder对象获取出来,避免了再次新建对象,反复findViewById等操作。

参考:

http://stackoverflow.com/questions/11945563/how-listviews-recycling-mechanism-works

http://stackoverflow.com/questions/25966689/what-is-the-working-of-settag-and-gettag-in-viewholder-pattern


public class MyAdapter extends BaseAdapter{

    private LayoutInflater mInflater;
    public MyAdapter(Context context){
        this.mInflater=LayoutInflater.from(context);
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return SimpleAdapterTest.names.length;
    }

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

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder=null;
        if(convertView==null){
            convertView=mInflater.inflate(R.layout.my_adapter_item, null);
            holder= new ViewHolder(convertView);
            //setTag的作用就是为了通过对holder的引用,实现缓存后继续试用holder
            //避免了每个页面的每一条item都重新定义holder并获取对应物理组件

            //原理:1.java中如果一个对象存在实引用,则JVM不能回收该对象
            //2.ListView有个循环机制,只有第一个手机显示屏所能够呈现的item
            //是需要新建View的,为了达到高效,Android复用了之前建好的view(convertView)
            //3.结合到一起,当listView向下滑动时,系统复用之前产生的convertView
            //从而可以将携带的Tag,即holder对象获取出来,避免了再次新建对象,反复findViewById等操作
            convertView.setTag(holder);
        }
        else{
            holder=(ViewHolder) convertView.getTag();
        }
        holder.myNameView.setText(SimpleAdapterTest.names[position]);
        holder.myDescView.setText(SimpleAdapterTest.desc[position]);
        holder.imageView.setImageResource( SimpleAdapterTest.imageIds[position]);
        holder.myButton.setText("bn["+(position+1)+"]");

        return convertView;
    }

    public final class ViewHolder{
        @InjectView(R.id.my_imageview)
        ImageView imageView;
        @InjectView(R.id.my_name)
        TextView myNameView;
        @InjectView(R.id.my_desc)
        TextView  myDescView;
        @InjectView(R.id.my_bn)
        Button myButton;
        public ViewHolder(View view){
            ButterKnife.inject(this, view);
        }

    }
}

4.运行效果图

这里粗略展示一下的自己写得Demo的粗糙效果

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 04:30:13

Android中ArrayAdapter、SimpleAdapter、BaseAdapter总结的相关文章

Android中Adapter之BaseAdapter使用

Android界面中有时候需要显示稍微复杂的界面时,就需要我们自定义一个adapter,而此adapter就要继承BaseAdapter,重新其中的方法. Android中Adapter类其实就是把数据源绑定到指定的View上,然后再返回该View,而返回来的这个View就是ListView中的某一 行item.这里返回来的View正是由我们的Adapter中的getView方法返回的.这样就会容易理解数据是怎样一条一条显示在ListView 中的. 在完成这篇文章中的例子之后,我思考了很长时间

Android高手进阶教程(十六)之---Android中万能的BaseAdapter(Spinner,ListView,GridView)的使用!

大家好!今天给大家讲解一下BaseAdapter(基础适配器)的用法,适配器的作用主要是用来给诸如(Spinner,ListView,GridView)来填充数据的.而(Spinner,ListView,GridView)都有自己的适配器(记起来麻烦).但是BaseAdapter(一招鲜)对他们来说却是通用的,为什么这么说呢,首先我们看一下API文档: 我们看一下BaseAdapter已经实现了ListAdapter和SpinnerAdapter的接口,而GridView的适配器是实现了List

Android中BaseAdapter使用基础点

Android中要填充一些控件(如ListView)经常须要用到Adapter来实现,经常使用的有ArrayAdapter,SimpleAdapter, CursorAdapter,BaseAdapter,前几个都是继承自BaseAdapter的. 我平时经常使用的就是ArrayAdapter,再就是 BaseAdapter了,SimpleAdapter本身事实上也不算简单.所以能用SimpleAdapter的时候我一般都用了BaseAdapter. 至于CuesorAdapter我就差点儿没用

13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用

1.ListView ListView 是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式.继承自抽象类 AdapterView.继承图如下所示: 以微信好友列表为例: 里面的每个好友就是由一个个 item 组成的,而每个item都存在Adapter适配器类中(负责数据处理),然后通过ListView显示出来. 2.ListView显示原理 ListView显示数据原理实际就是MVC设计模式,如下图所示: Model(模型) – 数据集合,用来存储数

【转】Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)

原文网址:http://embed.21ic.com/software/android/201403/31603.html 1 :Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现) . 今天学习了Spinner组件,使用Spinner相当于从下拉列表中选择项目,下面演示一下Spinner的使用(分别使用ArrayAdapter和自定义Adapter实现) (一):使用ArrayAdapter进行适配数据: ①:首先定义一个布局文件: android:

Android中的自定义Adapter(继承自BaseAdapter)——与系统Adapter的调用方法一致——含ViewHolder显示效率的优化(转)

Android中很多地方使用的是适配器(Adapter)机制,那我们就要好好把这个Adapter利用起来,并且用出自己的特色,来符合我们自行设计的需要喽~~~ 下面先上一个例子,是使用ViewHolder进行显示效率优化过的工程: package com.test.listviewsimpleadapter;    import java.util.ArrayList;  import java.util.HashMap;  import java.util.List;  import java

android中Baseadapter的 getItem 和 getItemId 的作用和重写

重写Baseadapter时,我们知道需要重写以下四个方法:getCount,getItem(int position),getItemId(int position),getView方法, getCount决定了listview一共有多少个item,而getView返回了每个item项所显示的view. 可是getItem(int position),getItemId(int position)有什么作用呢?该怎么重写呢? 首先看 getItem: @Override public Obje

Android技术18:Android中Adapter类详解

1.Adapter设计模式 Android中adapter接口有很多种实现,例如,ArrayAdapter,BaseAdapter,CursorAdapter,SimpleAdapter,SimpleCursorAdapter等,他们分别对应不同的数据源.例如,ArrayAdater对应List和数组数据源,而CursorAdapter对应Cursor对象(一般从数据库中获取的记录集).这些Adapter都需要getView方法返回当前列表项显示的View对象.当Model发生改变时,会调用Ba

Android 中常见控件的介绍和使用

1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.lang.Object   ? android.view.View   ? android.widget.TextView 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText 间接子类: AutoCompleteTextV