说说Adapter那点事l 自定义Adapter

来源:互联网 发布:php点击按钮运算 编辑:程序博客网 时间:2024/05/02 04:49

转自:http://www.cnblogs.com/halzhang/archive/2010/11/28/1890637.htm


Adapter在Android中占据一个重要的角色,它是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如图1直观的表达了Data、Adapter、View三者的关系。


图1 Adapter、数据、UI三者关系(PS:此图来自Google I/O)

一、Android中Adapter


图2:Android中Adapter类型层级图

由图2我们可以看到在Android中与Adapter有关的所有接口、类的完整层级图。在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。比较常用的有 BaseAdapter,ArrayAdapter,SimpleCursorAdapter等。

  • BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
  • ArrayAdapter支持泛型操作,通常需要实现getView方法,特殊情况下(结合数据row id),为了让ui事件相应处理方便点最好重写getItemId;
  • SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。
  • SimpleCursorAdapter与SimpleAdapter用法相近。只是将List对象换成了Cursor对象。而且SimpleCursorAdapter类构造方法的第四个参数from表示Cursor对象中的字段,而SimpleAdapter类构造方法的第四个参数from表示Map对象中的key。除此之外,这两个Adapter类在使用方法完全相同。
二、一个继承BaseAdapter的类的代码段

package learn.test;import java.util.ArrayList;import android.content.Context;import android.provider.MediaStore.Audio;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;/** * 歌曲列表适配器 *  * @version 2010-11-24 下午05:13:33 * @author Hal */public class AudioListAdapter extends BaseAdapter {private Context mContext;// 歌曲集合private ArrayList<Audio> mAudios;public AudioListAdapter(Context mContext, ArrayList<Audio> mAudios) {this.mContext = mContext;this.mAudios = mAudios;}@Overridepublic int getCount() {return mAudios != null ? mAudios.size() : 0;}@Overridepublic Object getItem(int position) {if ((mAudios != null && mAudios.size() > 0)&& (position >= 0 && position < mAudios.size())) {return mAudios.get(position);}return null;}/** * 如果集合中的对象数据来自数据库,建议此方法返回该对象在数据库中的ID */@Overridepublic long getItemId(int position) {if ((mAudios != null && mAudios.size() > 0)&& (position >= 0 && position < mAudios.size())) {return mAudios.get(position).getId();}return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO 返回自定的View}}


自定义Adapter的实例


public class Hello_testActivity extends Activity {String[] list = new String[]{"aaaaaa","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee","bbbbbb","cccccc","dddddd","eeeeee"};ListView lv_list;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        lv_list = (ListView) findViewById(R.id.list);        lv_list.setAdapter(new MyAdapter(this));    }        /**     *在这里自定义 的时候,也就是说ListView仅仅缓存了可视范围内的View,     *随后的滚动都是对这些View进行数据更新(就是运行getView()方法,显示没有被缓存的数据,     *如果回滚,同样的道理)。     *     *当屏幕上对任何一行的点击的触摸事件,都会触发getCount()和getItemId()两个方法     *     *position从0开始     * @author hb     */private class MyAdapter extends BaseAdapter{@SuppressWarnings("unused")Context context;LayoutInflater listContainer ;public MyAdapter(Context context) {this.context = context;//创建上下文listContainer = LayoutInflater.from(context);  //创建视图容器}@Overridepublic int getCount() {System.out.println("getCount--"+list.length);return list.length;}@Overridepublic Object getItem(int position) {System.out.println("getItem--"+position);return position;}@Overridepublic long getItemId(int position) {System.out.println("getItemId--"+position);return position;}/** * 运行一次更新一行数据; */@Overridepublic View getView(int position, View convertView, ViewGroup parent) {System.out.println("getView--"+position);//convertView是每一行的View,当每一屏幕显示有多少行的时候,就会创建多少个if(convertView == null){convertView = listContainer.inflate(R.layout.list_item, null);  //获取list_item布局文件的视图tv_item = (TextView) convertView.findViewById(R.id.tv_test);  //findViewById(R.id.tv_test)也是一个耗时的事情,但是如果用setTag会消耗大的.....哎,在这里原来tv_item不能定义为全局变量,不然显示有误差……System.out.println(tv_item);}tv_item.setText(list[position]);return convertView;}    }}


原创粉丝点击