Android之Adapter(适配器)

适配器Adapter在Android中用于将数据源与ListView、Spinner等控件绑定,提供了ArrayAdapter、SimpleAdapter、SimpleCursorAdapter等类型。ArrayAdapter适用于简单的文本信息填充,SimpleAdapter则能处理更复杂的视图元素,包括图片和文本。SimpleCursorAdapter与SimpleAdapter类似,但使用Cursor对象。自定义Adapter通过继承BaseAdapter并重写相关方法,可以实现更灵活的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        Adapter控件与其他的View控件相比,不同之处在于它们的内容通常是一个包含多项相同格式资源的列表,每次只显示其中的一项。

       既然它的内容是一个列表,就不能只通过调用setText()、setBackgroundResource()等方法来设置整个列表的内容,而是需要先把这些多项要加载的内容放到一个列表,然后加载到Adapter控件中,这个控件就称为适配器。


       Android中有四种Adapter对象供开发者使用

  • ArrayAdapter
  • SimpleAdapter
  • SimpleCursorAdapter
  • 自定义Adapter

        适配器一般用来给ListView、Spinner、Gallery、GridView控件填充数据。

  •  ArrayAdapter

        使用于列表中只包含文本信息的情况,填充文本信息最便捷的一种。

public class ListViewActivity extends Activity {
	private ListView lv;
	private ArrayAdapter adapter;//适配器
	private String[]data = new String[]
			{"数据1","数据2","数据3","数据4","数据5","数据6"};
	protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);
       lv=(ListView) findViewById(R.id.ListView_id);
       //创建适配器对象
       adapter = new ArrayAdapter(
    		   this, 
    		   android.R.layout.simple_list_item_1,//此乃适配器自带的一种布局
    		   data);
       lv.setAdapter(adapter);
       lv.setOnItemClickListener(
    		   new OnItemClickListener() {
				public void onItemClick(AdapterView<?> arg0, View arg1,
						int position, long id) {
					System.out.println("position:"+position+"---id:"
						+id+"---"+data[position]);
					
				}
	});
       
    }

}

上面代码是最简单的一种填充,如果我们填充的时候需要使用自己的布局格式的话,在创建Adapter对象的时候就需要调用另一个重载的方法:

      public ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)

第二个参数就是自己的布局。得意

public class ListViewAdapter extends Activity{
    private ListView lv;
    private ArrayAdapter adapter;
    private ArrayList<String> data;
    
	protected void onCreate(Bundle savedInstanceState) {
		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_list_view);
		lv=(ListView) findViewById(R.id.ListView_id);
		data = new ArrayList<String>();
		for (int i = 0; i < 30; i++) {
			data.add("第"+i+"个数据");
		}
		adapter = new ArrayAdapter(this,
				R.layout.adapter,
				R.id.textview_id , 
				data);
		 lv.setAdapter(adapter);
		 
		 
	}

	
}

用ArrayAdapter来帮助填充文本信息,大哥再也不担心一个一个setText()伤神了大笑


  • SimpleAdapter

ArrayAdapter只能填充文本信息,不够炫是吧,没错,功能更加强大的SimpleAdapter来了,它可以设置图片、文本、按钮等等。

SimpleAdapter使用List<Map>形式的数据源,List每项是一个Map,Map中包含各种不同的控件资源。

public class MainActivity extends Activity {

    private ListView lv;
    private List<Map<String, Object>> data;
    private SimpleAdapter adapter;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.listview_id);
        data = new ArrayList<Map<String,Object>>();
        HashMap<String, Object> map;
        for (int i = 0; i < 30; i++) {
			map = new HashMap<String, Object>();
			map.put("head", "第"+i+"个数字");
			map.put("img", R.drawable.ic_launcher);
			data.add(map);
		}
        adapter=new SimpleAdapter(this, 
        		data,//数据源
        		R.layout.adapter,//自定义布局 
        		new String[]{"img","head"},//这里通过map中的key值来获取value值
        		new int[]{R.id.imageview_id,R.id.textview_id});//与上面的value值对应,是控件的id,一对一填充
        lv.setAdapter(adapter);
        
        lv.setOnItemClickListener(
        		new OnItemClickListener() {
					public void onItemClick(AdapterView<?> parent, View view,
							int position, long id) {
						System.out.println("positon:"+position+"--id:"+id);
					}
		});
        
    }
    
}


  • SimpleCursorAdapter

SimpleCursorAdapter与SimpleAdapter用法相似,只是将List<Map>对象换成了Cursor对象。

		SimpleCursorAdapter adapter = new SimpleCursorAdapter(context,
				layout,
				c,//Cursor对象作为数据源
				from,//字段名组成的数组
				to);//布局中控件Id组成的数组,与上面一一对应


  • 自定义Adapter

功能最强大的适配器,想要什么功能自己添加奋斗

自定义Adapter需要继承BaseAdapter,至少重写四个方法:

getCount()   获得集合大小

getItem(int position)   根据position来获取集合中的数据

getItemId(int position) 根据position获取id

getView()  重中之重  用来填充控件最重要的方法

public class MyAdapter extends BaseAdapter {
	
	//先要有数据源   list中为一个QQ对象
	private List<QQ> list;
	
	private Context context;

	//构造函数
	public MyAdapter(Context context, List<QQ> list){
		this.context = context;
		this.list = list;
	}
	public int getCount() {
		return list.size();
	}

	public Object getItem(int position) {
		return list.get(position);
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		//使用缓存技术来增加效率  通过自定义内部类ViewHolder
		ViewHolder holder = null;
		if(convertView == null){
			convertView = LayoutInflater.from(context).inflate(R.layout.myadapter,//所要填充的布局
					null);//权限
			holder = new ViewHolder();
			holder.head = (ImageView) convertView.findViewById(R.id.head_id);
			holder.talk = (TextView) convertView.findViewById(R.id.userTalk_id);
			holder.username = (TextView) convertView.findViewById(R.id.userName_id);
			convertView.setTag(holder);//放入缓存
		}else {//如果converView不为空,就不用重新获取了,直接从缓存中获得各个控件即可
			holder = (ViewHolder) convertView.getTag();//取出缓存
		}
		
		holder.head.setImageResource(list.get(position).getImageId());
		holder.talk.setText(list.get(position).getTalk());
		holder.username.setText(list.get(position).getUserName());
		
		return convertView;
	}

	public class ViewHolder{
		private ImageView head;
		private TextView username, talk;
	}
}

QQ类:

public class QQ {

	private int imageId;
	private String userName;
	private String talk;
	public int getImageId() {
		return imageId;
	}
	public void setImageId(int imageId) {
		this.imageId = imageId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getTalk() {
		return talk;
	}
	public void setTalk(String talk) {
		this.talk = talk;
	}
 
	
}



    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值