自定义的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);
    }
}

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