自定义的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; }
代码中注释的代码是是没使用缓存处理时的代码,使用缓存处理的好处就是可以优化系统,避免资源的浪费。需要注意的是import
com.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); }}
运行结果:就像简易的电话本一样,上面有张飞,关羽,刘备的名字,我们可以继续在上面添加控件,来丰富内容。