`
1140566087
  • 浏览: 559118 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
博客专栏
2c4ae07c-10c2-3bb0-a106-d91fe0a10f37
c/c++ 入门笔记
浏览量:18530
3161ba8d-c410-3ef9-871c-3e48524c5263
Android 学习笔记
浏览量:314093
Group-logo
J2ME 基础学习课程集
浏览量:18737
A98a97d4-eb03-3faf-af96-c7c28f709feb
Spring 学习过程记录...
浏览量:17581
社区版块
存档分类
最新评论

Android 之 自定义适配器

阅读更多
自定义适配器

1、实现
* 自定义适配器要继承 BaseAdapter 类
* 实现getView() 方法;


package com.sun.useradapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class MainActivity extends Activity {

	private ListView listView;

	// 程序入口
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		listView = (ListView) findViewById(R.id.listView);
		List list = getData();
		UserAdapter adpter = new UserAdapter(this,list,R.layout.list_item, new String[]{"image","tx1","tx2"},new int[]{R.id.imageView1,R.id.textView1,R.id.textView2});
		listView.setAdapter(adpter);
		
	}

	// 得到映射的数据
	public List<Map<String,Object>> getData(){
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		Map map = new HashMap();
		map.put("image",R.drawable.ic_launcher);
		map.put("tx1", "我是tx1");
		map.put("tx2","我是tx2");
		list.add(map);

		map = new HashMap();
		map.put("image",R.drawable.ic_launcher);
		map.put("tx1", "我是tx1");
		map.put("tx2","我是tx2");
		list.add(map);


		return list;
	}


}


自定义适配器,继承baseAdapter:


package com.sun.useradapter;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 功能实现:条目上能实现按钮以及复选框的事件
 * 
 * @author Administrator
 * 
 */

public class UserAdapter extends BaseAdapter {

	private Context context;
	private LayoutInflater inflater; // 视图容器,其功能和 findViewById();
	// 类似,查找布局文件,并实例化对象
	private List<Map<String, Object>> list; // 数据容器 , 封装用户传递过来的数据
	private int layoutID; // 条目的布局ID
	private String from[]; // 数据中的 key -- 该key 对应的值用于显示到对应的控件上
	private int to[]; // 控件ID , 和 from 中key 的 value 对应, 实现一一对应的关系

	/**
	 * 用于接收数据,并进行初始化的操作
	 * 
	 * @param context
	 *            当前上下文
	 * @param list
	 *            数据集
	 * @param layoutID
	 *            资源ID ,条目上的
	 * @param from
	 *            key
	 * @param to
	 *            key 的 value 对应的控件
	 */
	public UserAdapter(Context context, List<Map<String, Object>> list,
			int layoutID, String[] from, int[] to) {
		super();
		this.context = context;
		this.list = list;
		this.layoutID = layoutID;
		this.from = from;
		this.to = to;
		this.inflater = LayoutInflater.from(context); // 获得视图容器对象
	}

	/**
	 * 返回 条目数量,根据数据集多少,有多少数据画多少次
	 */
	public int getCount() {
		Log.i("msg", "getCount()...");
		return list.size();
	}

	/**
	 * 返回当前条目的内容
	 */
	public Object getItem(int arg0) {
		Log.i("msg", "getItem()...");
		return list.get(arg0);
	}

	/**
	 * 返回条目ID
	 */
	public long getItemId(int position) {
		Log.i("msg", "getItemID()...:" + position);
		return position;
	}

	/**
	 * 画 条目布局内容,
	 */
	public View getView(int position, View convertView, ViewGroup parent) {
		Log.i("msg", "getView()...当前条目 position:" + position);

		if(convertView==null){
			convertView = inflater.inflate(layoutID, null); // 将用于布局的资源,进行转换为视图对象
		}

		// 读取数据 ---
		for (int i = 0; i < from.length; i++) {
			if(convertView.findViewById(to[i]) instanceof ImageView){
				ImageView iv = (ImageView) convertView.findViewById(to[i]); // 初始化一个ImageView 对象
				// 设置该对象的相关信息
				iv.setBackgroundResource((Integer)list.get(position).get(from[i])); // 设置背景数据

			}else if(convertView.findViewById(to[i]) instanceof TextView){
				TextView tx = (TextView) convertView.findViewById(to[i]); // 根据资源ID 获取控件对象
				tx.setText((String)list.get(position).get(from[i]));
			}else{
				// 用于扩展
			}
		}

		// 编写事件监听器
		addListener(convertView,position); // 指定的控件触发事件
		return convertView;
	}

	/**
	 * 其余控件的事件监听
	 * @param convertView
	 */
	public void addListener(final View convertView,final int position){
		Log.i("msg", "addListener()...");
		
		// 按钮点击事件
		convertView.findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				
				Toast.makeText(context, "按钮触发",1000).show();
				TextView x = (TextView) convertView.findViewById(R.id.textView1);
				x.setText("我被改变了..");
			}
		});
		
		// 复选框事件
		((CheckBox)convertView.findViewById(R.id.checkBox1)).setOnCheckedChangeListener(new OnCheckedChangeListener() {
			
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				
				if(isChecked){
					Toast.makeText(context, "选中了..."+position, 1000).show();
				}else{
					Toast.makeText(context, "未选中..."+position, 1000).show();
				}
				
			}
		});
	}

}
-----------------------------------------------------------------------

方式二:

主函数入口:

package com.example.listview_adapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Spinner;

public class MainActivity extends Activity {

	//声明属性
	private ListView lv;
	private Spinner spinner;
	
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//获取对象
		lv = (ListView) findViewById(R.id.lv);
		//spinner = (Spinner) findViewById(R.id.spinner);
		
		List<Map<String,Object>> li = this.getData();
		UserAdapter adapter = new UserAdapter(li,this);
		lv.setAdapter(adapter);
	}
	
	/**
	 * 获取数据源
	 */
	public List<Map<String,Object>> getData(){
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		Map<String,Object> map = null;
		
		map = new HashMap<String,Object>();
		map.put("name", "小三");
		map.put("age",12);
		map.put("btn", R.drawable.ic_launcher);
		list.add(map);
		
		map = new HashMap<String,Object>();
		map.put("name", "小四");
		map.put("age",15);
		map.put("btn", R.drawable.ic_launcher);
		list.add(map);
		Log.i("msg","数据数为:"+list.size());
		return list;
	}
}


自定义适配器:

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/**
 * ListView 的创建,一般要具备两大元素
 * 1、数据集,即要映射的字符串、图片信息之类
 * 2、适配器,实现把要映射的字符串、图片信息映射成视图(如:TextView  Image 等 组件),再添加到ListView中
 * 
 * @author Administrator
 *
 */

public class UserAdapter extends BaseAdapter implements OnClickListener {

	private List<Map<String,Object>> listItems; //数据集
	private Context context;	//上下文
	private LayoutInflater listContainer; //视图容器
	
	//自定义控件集合
	public final class ListItemView{
		public Button btn;
		public TextView name;
		public TextView age;
	}
	
	public UserAdapter(List<Map<String, Object>> listItems, Context context) {
		super();
		this.listItems = listItems;
		this.context = context;
		listContainer = LayoutInflater.from(context); //创建视图容器工厂,并设置上下文
	}

	// 返回的是列表条目的个数
	public int getCount() {
		Log.i("msg", "getCount()...");
		return listItems.size();
	}

	// 返回的是列表条目的内容,根据 位置 在数据中对应查找
	public Object getItem(int position) {
		Log.i("msg", "getItem()...");
		return listItems.get(position);
	}

	// 返回的是条目的ID
	public long getItemId(int position) {
		Log.i("msg", "getItemId()...");
		return position;
	}

	/**
	 * ListView Item 设置
	 */
	/* (non-Javadoc)
	 * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
	 */
	public View getView(int position, View convertView, ViewGroup parent) {
		Log.i("msg", "getView()...");
		//自定义视图
		ListItemView listItemView = null;
		if(convertView == null){
			Log.i("msg", "converView==null...");
			// 新创建一个控件集合对象
			listItemView = new ListItemView();
			
			//获取item1 布局文件视图
			convertView = listContainer.inflate(R.layout.item1,null);
			
			//获取控件对象
			listItemView.age = (TextView) convertView.findViewById(R.id.age);
			listItemView.name= (TextView) convertView.findViewById(R.id.name);
			listItemView.btn = (Button) convertView.findViewById(R.id.btn);
			
			//设置控件集到 convertView
			convertView.setTag(listItemView);
			
		}else{
			Log.i("msg", "converView!=null...");
			listItemView = (ListItemView) convertView.getTag();
		}
		Log.i("msg", "设置控件的值....当前position:"+position);
		listItemView.age.setText(listItems.get(position).get("age").toString());
		listItemView.name.setText(listItems.get(position).get("name").toString());
		listItemView.btn.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_launcher));
		listItemView.btn.setTag(String.valueOf(position));	//设置Tag 标记符
		listItemView.btn.setOnClickListener(this);  //设置事件
		return convertView;
	}

	// 按钮点击事件
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn:
			Toast.makeText(context, v.getTag().toString()+"值",Toast.LENGTH_LONG).show();
			break;
		}
		
	}


}


配置文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/myLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >



    <ListView
        android:id="@+id/lv"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

ListView 条目上的子项:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/myLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="姓名" />

    <TextView
        android:id="@+id/age"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="年龄" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:focusable="false"
        android:text="..." />

</LinearLayout>
分享到:
评论

相关推荐

    Android自定义适配器.ppt

    Android自定义适配器

    android中关于自定义适配器源代码

    在Android开发中,自定义适配器...总的来说,自定义适配器是Android开发中的核心技能之一,理解和熟练掌握其原理和使用方法对于提升应用的用户体验至关重要。通过实践和学习,你可以更好地应对各种复杂数据展示的需求。

    Android实现自定义适配器的ExpandableListView示例.rar

    Android实现自定义适配器的ExpandableListView示例,准备一级列表中显示的数据:2个一级列表,分别显示"group1"和"group2",准备第一个一级列表中的二级列表数据:两个二级列表,分别显示"childData1"和"childData2",...

    Android自定义适配器

    总结起来,Android自定义适配器是Android应用开发中的一个重要技术点,它使得我们能够自由地控制数据的展示方式,从而实现各种各样的界面效果。通过理解并熟练掌握自定义适配器的原理和实践,开发者可以更高效地构建...

    Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )

    本教程将深入讲解如何使用ListView,结合自定义适配器以及解决Out-Of-Memory(OOM)问题。 首先,`ListView`是一个可滚动的视图,它能够显示一行行的数据。它通过Adapter来获取数据并将其渲染为可视化的列表项。...

    listView之自定义适配器Demo

    在这个"ListView之自定义适配器Demo"中,我们将探讨如何使用自定义适配器来实现特定的UI布局和交互功能,包括点击事件处理以及内容展示。 首先,我们要了解ListView的工作原理。ListView通过Adapter来与数据源进行...

    Android基于自定义适配器的ExpandableListView源码.zip

    本压缩包"Android基于自定义适配器的ExpandableListView源码.zip"提供了一套完整的示例,帮助开发者深入理解如何通过自定义适配器来实现ExpandableListView的功能。 1. **ExpandableListView介绍** ...

    Android 基于自定义适配器的ExpandableListView源码.zip

    本资源“Android 基于自定义适配器的ExpandableListView源码.zip”提供了一个使用自定义适配器实现的ExpandableListView的示例代码,这对于理解如何在实际应用中使用该控件非常有帮助。 1. **ExpandableListView...

    Android自定义适配器的编写.doc

    ### Android自定义适配器的编写详解 在Android开发中,`ListView`是开发者们最为熟悉的组件之一,尤其是在游戏开发领域,它不仅适用于游戏排行榜,还能用于简单的游戏关卡选择等场景,展现了其广泛的应用潜力。尽管...

    Android 基于自定义适配器的ExpandableListView源码.rar

    本资源“Android 基于自定义适配器的ExpandableListView源码”提供了一种实现自定义适配器的方法,帮助开发者更好地理解和运用ExpandableListView。 首先,我们需要理解ExpandableListView的工作原理。这个控件分为...

    Android 基于自定义适配器的ExpandableListView源码.zip项目安卓应用源码下载

    Android 基于自定义适配器的ExpandableListView源码.zip项目安卓应用源码下载Android 基于自定义适配器的ExpandableListView源码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3....

    Android 基于自定义适配器的ExpandableListView源码

    本篇将深入探讨如何基于自定义适配器来实现`ExpandableListView`的功能,源码分析将帮助我们更好地理解其工作原理。 首先,`ExpandableListView`继承自`ListView`,它通过`ExpandableListAdapter`来管理数据,这个...

    安卓开发-android基于自定义适配器的ExpandableListView.zip.zip

    在这个“安卓开发-android基于自定义适配器的ExpandableListView.zip”压缩包中,我们很可能会找到关于如何实现自定义适配器以驱动ExpandableListView的示例代码和教程。 首先,让我们理解ExpandableListView的工作...

    Android 基于自定义适配器的ExpandableListView源码.zip源码资源下载

    在这个`Android 基于自定义适配器的ExpandableListView源码.zip`资源中,我们可以学习如何通过自定义适配器来有效地管理和显示这种复杂的列表数据。 首先,`ExpandableListView`继承自`ListView`,增加了可扩展性,...

    Android 基于自定义适配器的ExpandableListView源码-IT计算机-毕业设计.zip

    此项目“Android 基于自定义适配器的ExpandableListView源码”是一个毕业设计示例,适用于学习如何在Android应用中实现这种复杂的数据结构。以下是对该项目中涉及的知识点的详细解释: 1. **ExpandableListView**:...

    Android应用源码之自定义适配器的ExpandableListView.zip

    在这个“Android应用源码之自定义适配器的ExpandableListView.zip”中,我们可以深入理解如何为ExpandableListView自定义适配器,以及如何在实际应用中实现其功能。 首先,ExpandableListView的工作原理是基于...

    android中自定义适配器BaseAdapter

    在Android开发中,自定义适配器BaseAdapter是一种常见的技术,用于将数据绑定到各种视图组件,如ListView、GridView或Spinner等。BaseAdapter是Android SDK提供的一种抽象类,它是Adapter接口的一个实现,允许开发者...

Global site tag (gtag.js) - Google Analytics