本文参考:http://www.cnblogs.com/mandroid/archive/2011/04/05/2005525.html
前言:Android的BaseAdapter适配器模式应用之普遍,几乎没有一个App可以说不用到了。App的Listview Gridview GallerySpinner等显示组件只要是写,那就肯定用到BaseAdapter。
原理:BaseAdapter继承至Adapter,Adapter在Android中起着数据和UI显示的桥梁的作用。这是Adapter的原理,是至关重要的理解点。
借用一张图表示一下:
常用子类:
BaseAdapter ArrayAdapter SimpleCursorAdapter等。
ListView运用到BaseAdapter举例:
public class MainActivity extends ActionBarActivity {
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)findViewById(R.id.lv);
lv.setAdapter(new LvAdapter());
}
private class LvAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return 20;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@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
convertView = getLayoutInflater().inflate(R.layout.lv_items, null);
TextView txt = (TextView)convertView.findViewById(R.id.txt);
txt.setText("第" + position + "个");
return convertView;
}
}
}
这是MainActivity部分。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context="com.ctrlz.csdnblog.MainActivity$PlaceholderFragment"
android:orientation="vertical"
android:background="#eeeeee" >
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:scrollbars="@null"
/>
</LinearLayout>
Listview声明部分。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
<View
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="txt"
/>
</LinearLayout>
这是listview的item部分,在这随意添加view,在MainActivity中显示处理,达到了任意自定义UI的效果。
后记:
在MainActivity中的代码convertView = getLayoutInflater().inflate(R.layout.lv_items, null);其实执行了20次,而我们知道执行一次就好了,那么问题来了,请看本博客的另一篇文章Android的Holder模式。