Adapter是连接后端数据和前端显示的桥梁,是数据和UI(View)之间的纽带。
在常见的View(ListView,GridView)等地方都需要用到Adapter。数据、Adapter和View之间的关系如下:
常见的适配器有以下几种:
- BaseAdapter:是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
- SimpleAdapter:有最好的扩充性,可以自定义出各种效果。
- ArrayAdapter:支持泛型操作,最为简单,只能展示一行字。
- SimpleCursorAdapter:可以适用于简单的纯文字型ListView,也可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
从源码上分析,其它类都是继承了BaseAdapter类,继承该类可以实现的功能最丰富,继承它需要实现以下四个方法:
- getCount():得到数据的行数,也可以控制item的数量
- getItem(int position):根据positon得到某一行的记录
- getItemId(int postion):得到某一条记录的ID
- getView(int position, View cnverView, ViewGroup parent):最重要的一个方法,重点介绍。功能是定义适配器以什么样的方式显示我们填充的数据,参数介绍如下,
position表示将显示的是第几行,converView是从布局文件(List中item的布局)中inflate来的,parent表示此视图最终会被附加到的父级视图。经典示例如下:
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater)MyListView.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View itemView = inflater.inflate(R.layout.item, null); TextView title = (TextView)itemView.findViewById(R.id.itemTitle); title.setText(itemTitles[position]); return itemView; } else { TextView title = (TextView)convertView.findViewById(R.id.itemTitle); title.setText(itemTitles[position]); return convertView; } }
通过视图缓存机制优化,适配器的完整代码如下:
public class ViewHolderAdapter extends BaseAdapter { private List<String> mData; private LayoutInflater mInflater; public ViewHolderAdapter(Context context, List<String> data){ this.mData=data; mInflater=LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub,控制只显示3个item return mData.size() > 3 : 3 : mData.size; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mData.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } public final class ViewHolder{ public ImageView img; public TextView title; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder=null; if(convertView==null){ holder=new ViewHolder(); convertView=mInflater.inflate(R.layout.viewholder_item,null);//填充自定义item holder.img=(ImageView)convertView.findViewById(R.id.imageView); holder.title=(TextView)convertView.findViewById(R.id.textView); convertView.setTag(holder); }else{ //通过Tag找到缓存的布局 holder=(ViewHolder)convertView.getTag(); } holder.img.setBackgroundResource(R.drawable.one); holder.title.setText(mData.get(position)); return convertView; } }
最后在MainActivity中显示
public class MainActivity extends Activity { private List<String> mData; private ViewHolderAdapter adapter; private ListView listview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listview=(ListView) findViewById(R.id.listview); mData=new ArrayList<String>(); for(int i=0;i<120;i++){ mData.add(""+i); } adapter=new ViewHolderAdapter(this,mData); listview.setAdapter(adapter); } }