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);
    }
}

  效果图:

        

自定义LoadBalancer 规则 自定义adapter_数据