1.常用ListViewAdapter的几种适配器比较
1、ArrayAdapter<T>。这是一个支持绑定任意对象数组到列表的数据适配器。这个适配器默认的View绑定是一个TextView。当这个TextView被使用的时候,
它将调用这个数组中每一个对象的toString()方法。如果需要选择性地显示数组中对象的信息,需要重写toString()方法,来满足定制化需求;如果需要显示
其它类型的View,需要通过重写getView()方法来实现。
2、BaseAdapter。这是一个共同的基类的公共实现适配器,可以在同时使用的ListView(通过实现专业化 ListAdapter接口)和微调
(通过实现专业化SpinnerAdapter接口)。总之,通过继承BaseAdapter,你可以自由定制自己的数据适配。
3、SimpleAdapter。这是一个用来绑定Map类型数据的数据适配器。
4、ListAdapter。ListAdapter是一个之间的桥梁的ListView和数据备份的列表。频繁的数据来自一个游标,但不是必需的。
ListView中可以显示,只要是包裹在一个ListAdapter任何数据。
5、CursorAdapter。CursorAdapter是用来访问Cursor的数据适配器,要求Cursor必须包含一个名为“_id”的字段,否则这个类将无法正常工作。
6、SimpleCursorAdapter。用于将光标和在一个XML文件中定义TextViews或ImageViews实现绑定。常常用于数据库的数据绑定。
2.自定义适配器的好处
- a、在适配的组件里(如ListView,GridView)定义自己想要的布局(Layout)。
- b、为布局里的组件(如Button)添加触发响应的事件(如Click)。
3.步骤:
a.自定义一个适配器(MyAdapter),需要继承BaseAdapter,并覆写里面的方法
b.自定义数据模型,将自己定义的数据作为适配器的数据源。
c.使用该自定义的适配器。
4.案例:jobModel类的数据通过自定义的adapter添加到一个Listview里
jobModel类:
//自定义数据模型,作为适配器使用的数据源
public class JobModel {
//字段,有默认值
String title="设计总监";
String content="不设要求";
String salary="1万每月";
String company_name="倒闭公司";
int is_urgent=0;//默认为0
}
MyAdapter适配器:
//自定义一个适配器(模仿simpleadapter的源码):数据源是ListitemModel
//覆写以下方法时,要注意,当设置完该适配器后,程序运行它的覆盖方法的顺序是以下面的方法顺序相应的
//即getCount()是先于getView的
public class MyAdapter extends BaseAdapter {
private LayoutInflater mInflater=null;
private JobModel mdata=null;
private int mResource;
//默认只传一个数据模型
public MyAdapter(Context context,JobModel data,int resource)
{
//根据context,创建一个布局填充器
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//传入数据源
mdata=data;
//传入布局文件的id:数据源放哪
mResource=resource;
}
@Override
public int getCount() {
//因为默认传入一个数据模型
Log.v("------","适配器:getCount()方法");
return 1;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建一个视图并返回
View v=null;
if(convertView==null)
{ //用context给的布局填充器创建视图
v=mInflater.inflate(mResource,parent,false);
}else{
v=convertView;
}
//为视图填充相应的数据(可以封装成一个bindView(int position, View view)方法)
TextView tv1=(TextView)v.findViewById(R.id.title);
TextView tv2=(TextView)v.findViewById(R.id.content);
TextView tv3=(TextView)v.findViewById(R.id.salary);
TextView tv4=(TextView)v.findViewById(R.id.company_name);
TextView tv5=(TextView)v.findViewById(R.id.is_urgent);
tv1.setText(mdata.title);
tv2.setText(mdata.content);
tv3.setText(mdata.salary);
tv4.setText(mdata.company_name);
return v;
}
@Override
public long getItemId(int position) {
//默认只有一个
return 0;
}
@Override
public Object getItem(int position) {
//默认只有一个
return mdata;
}
}
job_list_item布局文件:适配器为数据源指定的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/salary"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/company_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/is_urgent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
activity_job_list布局文件:activity指定的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.hq.listviewdemo.JobListActivity"
android:orientation="vertical"
>
<TextView
android:text="这里是JobListActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ListView
android:id="@+id/joblistview"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
使用该适配器:
//显示joblistactivity
public class JobListActivity extends Activity {
private ListView listView=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_job_list);
listView=(ListView)findViewById(R.id.joblistview);
JobModel data=new JobModel();
MyAdapter myAdapter=new MyAdapter(this,data,R.layout.job_list_item);
listView.setAdapter(myAdapter);
}
}
效果图: