自定义的Adapter的简单设计和使用

   Adapter一共有四种,分别是ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,自定义的Adapter。自我感觉这里最复杂的就是自定义的Adapter同时也是使用最多的。废话少说,直接上代码。

   首先在res->layout->activity_main_xml文件中建立一个ListView控件,直接拖进去就行了。然后在layout里面再建立一个xml文件,例如取名为cell,然后在里面建立一个TextView。由于我们要自己创建一个Adapter,所以在src中创建一个包,然后在该包中创建一个类,在该类中我们写自定义的Adapter。下面就是具体代码:

   

package myadapter;import com.anjoyo.myadapter.R;import android.R.layout;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;//继承BaseAdapter类public class MyAdapter extends BaseAdapter {    //承接上下文    private Context context;    //定义数据    private String[] data;    //构造方法    public MyAdapter(Context context, String[] data,int[] iamge) {        this.context = context;        this.data = data;        this.p_w_picpath = iamge;    }//重写4个方法    //返回当前数据源的数据量    @Override    public int getCount() {        return data.length;    }//返回当前的一项    @Override    public Object getItem(int arg0) {        return data[arg0];    }//返回当前每一项的ID    @Override    public long getItemId(int arg0) {        return arg0;    }//返回一个视图    @Override    public View getView(int arg0, View arg1, ViewGroup arg2) {        //加载视图//      LayoutInflater inflater = (LayoutInflater) context//              .getSystemService(Context.LAYOUT_INFLATER_SERVICE);//      LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.cell,//              null);//      tv = (TextView) layout.findViewById(R.id.textView1);//      tv.setText(data[arg0]);        ViewHolder holder;        if (arg1==null) {            arg1 = LayoutInflater.from(context).inflate(R.layout.cell, null);            holder = new ViewHolder();//          tv = (TextView) arg1.findViewById(R.id.textView1);            holder.tv = (TextView) arg1.findViewById(R.id.textView1);            holder.iv = (ImageView) arg1.findViewById(R.id.p_w_picpathView1);//          tv.setText(data[arg0]);//          tv.setText(data[arg0]);            arg1.setTag(holder);        }   else{//          tv = (TextView) arg1.findViewById(R.id.textView1);//          tv.setText(data[arg0]);            holder = (ViewHolder) arg1.getTag();        }        holder.tv.setText(data[arg0]);        holder.iv.setBackgroundResource(p_w_picpath[arg0]);        return arg1;    }    //使用ListView的缓存处理    private static class ViewHolder{        TextView tv;    }

代码中注释的代码是是没使用缓存处理时的代码,使用缓存处理的好处就是可以优化系统,避免资源的浪费。需要注意的是importcom.anjoyo.myadapter.R;

接着我们需要在MainActivity中引用这个Adapter,看具体代码:

   

package com.anjoyo.myadapter;import myadapter.MyAdapter;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.ListView;public class MainActivity extends Activity {    private MyAdapter adapter;    private ListView lv;    private String[] data = {"张飞","关羽","刘备"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        lv = (ListView) findViewById(R.id.listView1);        //Adapter加载内容        adapter = new MyAdapter(this, data);        //绑定ListView        lv.setAdapter(adapter);    }}

运行结果:就像简易的电话本一样,上面有张飞,关羽,刘备的名字,我们可以继续在上面添加控件,来丰富内容。