我们在前面三篇文章分别介绍了ArrayAdapter和SimpleAdapter的使用,可以先总结一下:
1)ArrayAdapter,是一个跟Array结构对应的Adapter,所以它展示的内容取决于Array里面装的对象,在默认或者大部分情况下,如果一个list只是要用来展示一些文字方面的效果,比如文章列表,联系人列表等比较简洁的描述,这是个最好的选择。当然,我们也可以通过继承它来自定义一个Adapter。
2)SimpleAdapter,需要1)我们自定义item的布局,2)需要我们将数据源封装成一个List<Map<String,?>>结构的列表中去,3)要将布局中的控件跟map中的数据对应起来。SimpleAdapter可以根据我们的需要,实现比较灵活的布局和效果,这方面是ArrayAdapter比不上的。
Android已经帮我们实现了这两个Adapter的逻辑,并封装得很好,好到我们只需要创建一个对象就可以用了。但有时候,包装得太过的东西总是麻烦,灵活性还是不够。
而在日常的开发中,我们经常会用到的,更多的是BaseAdapter,这个抽象类,而ArrayAdapter和SimpleAdapter,其实也是BaseAdapter的子类。
class MyAdapter extends BaseAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return 0; } @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 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub return null; } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:padding="5dip" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView1" android:layout_width="80dip" android:layout_height="60dip" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:contentDescription="testing"/> <TextView android:id="@+id/tvTitle" android:layout_width="80dip" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageView1" android:layout_alignTop="@+id/imageView1"/> <TextView android:id="@+id/tvContent" android:layout_width="80dip" android:layout_height="wrap_content" android:layout_below="@+id/tvTitle" android:layout_toRightOf="@+id/imageView1" android:layout_alignBottom="@+id/imageView1"/> </RelativeLayout>
class MyAdapter extends BaseAdapter{ @Override public int getCount() { return titles.length;//返回titles.length,总共是6个。 } @Override public Object getItem(int position) { // TODO Auto-generated method stub return titles[position]; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { //将布局inflate出来,然后获得布局上的控件,设置值 View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.simpleadapter, null); ImageView imageView = (ImageView) view.findViewById(R.id.imageView1); imageView.setImageResource(drawableIds[position]); TextView tvTitle = (TextView) view.findViewById(R.id.tvTitle); tvTitle.setText("ba title " + position); TextView tvContent = (TextView) view.findViewById(R.id.tvContent); tvContent.setText("ba content" + position); return view; } }
class MyAdapter extends BaseAdapter{ @Override public int getCount() { return 10000; } ... @Override public View getView(int position, View convertView, ViewGroup parent) { ... imageView.setImageResource(drawableIds[position % 6]);//取模,因为图片有限 ... } }下面是效果图:
public View getView(int position, View convertView, ViewGroup parent) { return createViewFromResource(position, convertView, parent, mResource); } private View createViewFromResource(int position, View convertView, ViewGroup parent, int resource) { View view; TextView text; if (convertView == null) { view = mInflater.inflate(resource, parent, false); } else { view = convertView; }可以看到,会首先去判断convertView是否为null,当其为null的时候,才去重新创建一个view,不是的话,就直接用convertView。那么这个convertView是什么东西呢?其实它就是刚刚离开屏幕的那个View,所以我们可以复用它,这样我们就可以极大极大地减少这个view的创建。
@Override public View getView(int position, View convertView, ViewGroup parent) { View view ; if(convertView == null){ view = LayoutInflater.from(MainActivity.this).inflate(R.layout.simpleadapter, null); }else{ view = convertView; } ... }
public View getView(int position, View convertView, ViewGroup parent) { View view ; ViewHolder viewHolder; if(convertView == null){ view = LayoutInflater.from(MainActivity.this).inflate(R.layout.simpleadapter, null); ImageView imageView = (ImageView) view.findViewById(R.id.imageView1); TextView tvTitle = (TextView) view.findViewById(R.id.tvTitle); TextView tvContent = (TextView) view.findViewById(R.id.tvContent); viewHolder = new ViewHolder(imageView, tvTitle, tvContent); view.setTag(viewHolder); }else{ view = convertView; viewHolder = (ViewHolder) view.getTag(); } viewHolder.imageView.setImageResource(drawableIds[position % 6]); viewHolder.tvTitle.setText("ba title " + position); viewHolder.tvContent.setText("ba content" + position); return view; } } class ViewHolder { public ViewHolder(ImageView imageView, TextView tvTitle, TextView tvContent){ this.imageView = imageView; this.tvTitle = tvTitle; this.tvContent = tvContent; } ImageView imageView; TextView tvTitle; TextView tvContent; }
Android中关于Adapter的使用(下)BaseAdapter
原文:http://blog.csdn.net/linmiansheng/article/details/19249083