`
hbxflihua
  • 浏览: 667840 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ListView自定义adapter处理多事件

阅读更多

使用过ListView 的开发人员都知道,ListView 在一般情况下只能对每条记录设置一个监听事件。如果想在其中添加多个事件,就需要自定义Adapter

 

下面介绍一下如何自定义adapter 以及如何在一个Item 中绑定多个事件。

这里我们需要两个XML 文件、两个java 类。分别是存放ListViewXMLListViewItemXMLActivity 类和Adapter 类。

 

首先说说两个XML 文件。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding= "10dip" 
    android:orientation="vertical" >

    <ListView 
        android:id="@id/android:list" 
        android:layout_width = "fill_parent" 
        android:layout_height = "fill_parent" /> 

</LinearLayout>

 

注意:这里的ListViewid 使用了android 自定义的: @id/android:list

 

lvItem.xml

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants"
    android:padding="5dip" >

    <ImageView
        android:id="@+id/ItemImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dip" />

    <ImageButton
        android:id="@+id/ItemCloseWin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/ItemWinName"
        android:layout_alignTop="@+id/ItemWinName"
        android:layout_alignParentRight="true"
        android:background="#e0000000"
        android:focusable="false"
        android:gravity="left|center_vertical"
        android:src="@android:drawable/ic_menu_close_clear_cancel" />

    <ImageButton 
        android:id="@+id/ItemEmail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/ItemWinName"
        android:layout_alignTop="@id/ItemWinName"
        android:layout_toLeftOf="@id/ItemCloseWin"
        android:background="#e0000000"
        android:focusable="false"
        android:gravity="left|center_vertical"
        android:src="@android:drawable/ic_dialog_email" />
    
    <TextView
        android:id="@+id/ItemWinName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/ItemImage"
        android:layout_alignTop="@id/ItemImage"
        android:layout_toLeftOf="@id/ItemEmail"
        android:layout_toRightOf="@id/ItemImage"
        android:gravity="left|center_vertical"
        android:text="title"
        android:textSize="20dip" />

</RelativeLayout>

 

 

接下来看看Activity

 

package cn.mutil;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
/**
 * ListView item 多事件Activity
 * @author lihua
 *
 */
public class LvWithButtonActivity extends ListActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// 关联Layout中的ListView
		ListView vncListView = (ListView) findViewById(android.R.id.list);

		// 生成动态数组,加入数据
		ArrayList<HashMap<String, Object>> remoteWindowItem = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < 10; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("ItemImage", R.drawable.ic_launcher); // 图像资源的ID
			map.put("ItemWinName", "Window ID " + i);
			map.put("ItemEmail", android.R.drawable.ic_dialog_email);
			map.put("ItemCloseWin",	android.R.drawable.ic_menu_close_clear_cancel);
			remoteWindowItem.add(map);
		}

		// 生成适配器的Item和动态数组对应的元素
		LvButtonAdapter listItemAdapter = new LvButtonAdapter(this,
				remoteWindowItem, // 数据源
				R.layout.lvitem, // ListItem对应的XML
				// 动态数组与ImageItem对应的子项
				new String[] { "ItemImage", "ItemWinName","ItemEmail", "ItemCloseWin" },
				// ImageItem的XML文件里面的一个ImageView,两个TextView ID
				new int[] { R.id.ItemImage, R.id.ItemWinName, R.id.ItemEmail, R.id.ItemCloseWin });

		vncListView.setAdapter(listItemAdapter);
		
		/**
		 * 设置整个Item被点击的事件
		 * 该事件在其他有事件的组件未被点击时触发
		 */
		vncListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> adapter, View view, 
					int position,long arg3) {
				
				TextView content = (TextView)view.findViewById(R.id.ItemWinName);
				Toast.makeText(LvWithButtonActivity.this, content.getText().toString() , Toast.LENGTH_SHORT).show();
			}
			
		});
	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		l.getItemAtPosition(position);
	}

}

 

最后一个也是最重要的一个,自定义adapter

 

package cn.mutil;

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

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class LvButtonAdapter extends BaseAdapter {

	private class ButtonViewHolder {
		ImageView appIcon;
		TextView appName;
		ImageButton buttonEmail;
		ImageButton buttonClose;
	}

	private ArrayList<HashMap<String, Object>> mAppList;//用于存放传递过来显示于ListView中的 数据
	private LayoutInflater mInflater;
	private Context mContext;
	private String[] keyString;
	private int[] valueViewID;
	private ButtonViewHolder holder;

	public LvButtonAdapter(Context c,//上下文
			ArrayList<HashMap<String, Object>> appList,//绑定数据 
			int resource00000,//ListView行记录layout
			String[] from, 
			int[] to) {
		mAppList = appList;
		mContext = c;
		mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		keyString = new String[from.length];
		valueViewID = new int[to.length];
		System.arraycopy(from, 0, keyString, 0, from.length);
		System.arraycopy(to, 0, valueViewID, 0, to.length);
	}

	@Override
	public int getCount() {
		return mAppList.size();
	}

	@Override
	public Object getItem(int position) {
		return mAppList.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}
	/**
	 * 删除数据集中的值
	 * @param position
	 */
	public void removeItem(int position) {
		mAppList.remove(position);
		this.notifyDataSetChanged();
	}
	
	/**
	 * 改变数据集中的值
	 * @param position
	 * @param map
	 */
	public void changeItem(int position,HashMap<String, Object> map){
		mAppList.remove(position);
		mAppList.add(position, map);
		this.notifyDataSetChanged();
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if (convertView != null) {
			holder = (ButtonViewHolder) convertView.getTag();
		} else {
			convertView = mInflater.inflate(R.layout.lvitem, null);
			holder = new ButtonViewHolder();
			holder.appIcon = (ImageView) convertView
					.findViewById(valueViewID[0]);//可以将valueViewID[0]替换成R.id.xxx
			holder.appName = (TextView) convertView
					.findViewById(valueViewID[1]);
			holder.buttonEmail = (ImageButton) convertView
					.findViewById(valueViewID[2]);
			holder.buttonClose = (ImageButton) convertView
					.findViewById(valueViewID[3]);
			convertView.setTag(holder);
		}

		HashMap<String, Object> appInfo = mAppList.get(position);
		if (appInfo != null) {
			String aname = (String) appInfo.get(keyString[1]);
			int mid = (Integer) appInfo.get(keyString[0]);
			int eid = (Integer) appInfo.get(keyString[2]);
			int bid = (Integer) appInfo.get(keyString[3]);
			
			holder.appName.setText(aname);
			holder.appName.setOnClickListener(new LvButtonListener(position));
			holder.appIcon.setImageDrawable(holder.appIcon.getResources().getDrawable(mid));			
			holder.buttonEmail.setImageDrawable(holder.buttonEmail.getResources().getDrawable(eid));
			holder.buttonEmail.setOnClickListener(new LvButtonListener(position));			
			holder.buttonClose.setImageDrawable(holder.buttonClose.getResources().getDrawable(bid));
			holder.buttonClose.setOnClickListener(new LvButtonListener(position));
		}
		return convertView;
	}
	
	/**
	 * 按钮事件监听
	 * @author lihua
	 *
	 */
	private class LvButtonListener implements View.OnClickListener {
		private int position;

		LvButtonListener(int pos) {
			position = pos;
		}

		@Override
		public void onClick(View v) {
			int vid = v.getId();
			
			HashMap<String, Object> curMap = (HashMap<String, Object>)getItem(position);		
			
			if (vid == holder.buttonClose.getId()){	//删除一行记录
				
				Toast.makeText(mContext,"position:"+position+",data is being Deleted", Toast.LENGTH_LONG).show();
				removeItem(position);
				//可以在这里操作数据库或更新服务端数据
				
			}else if(vid == holder.buttonEmail.getId()){//发送邮件
				
				Toast.makeText(mContext, "position:"+position+",sending email to xxx!", 
						Toast.LENGTH_SHORT).show();
				//可以在这里操作数据库或更新服务端数据
				
			}else if(vid == holder.appName.getId()){//设置名称
				
				Toast.makeText(mContext, "position is "+position+", appName:"+curMap.get("ItemWinName").toString(), 
						Toast.LENGTH_SHORT).show();
				curMap.put("ItemWinName", System.currentTimeMillis()+"");
				changeItem(position,curMap);
				//可以在这里操作数据库或更新服务端数据
				
			}
		}
	}

}
分享到:
评论
2 楼 zhengzhihao1 2015-07-16  
赞一个,,
1 楼 814687491 2014-07-03  
这帖子帮了我不少忙,给你分享到微薄!

相关推荐

    安卓listview自定义adapter

    安卓listview自定义adapter包括demo和一些其他自定义绑定的代码

    listview 自定义adapter的例子demo

    示例中的"adapter"文件可能包含了实现以上步骤的代码,包括自定义Adapter类、数据模型类以及展示数据的布局文件。在实际开发中,你可能还需要处理点击事件、优化视图复用等高级功能。 总之,自定义ListView的...

    Android自定义adapter的listview

    为了实现更加灵活和丰富的界面展示,我们通常需要对ListView进行自定义,这涉及到自定义Adapter的使用。自定义Adapter允许我们根据需求定制ListView的每一项视图,以适应不同的数据结构和界面设计。 首先,我们需要...

    ListView自定义Adapter实现多视图Item

    通过以上步骤,我们就可以实现ListView自定义Adapter的多视图Item功能。这不仅可以使列表更具多样性,还可以提升用户体验。在处理复杂数据展示时,这是非常实用的一种技术。在实际开发中,我们还可以进一步优化,...

    Android ListView 自定义adapter好友列表

    本文将深入探讨如何使用自定义Adapter来创建一个功能丰富的Android ListView好友列表。 首先,我们需要理解ListView的工作原理。ListView依赖于Adapter来提供数据和视图之间的桥梁。Adapter是连接数据源(如...

    Listview自定义Adapter显示省名并响应item事件

    在Android开发中,ListView是一个非常常用的控件,用于展示大量数据...但这个例子已经足够让你理解Adapter的工作原理和ListView的事件处理机制。通过实践和扩展,你可以更好地掌握这些知识,并应用于更复杂的项目中。

    listview自定义Adapter实现仿qq页面

    在Android开发中,ListView是一种常用的控件,用于展示大量数据列表。本项目旨在教你如何通过自定义Adapter来实现一个仿QQ...通过这个项目,你不仅能掌握自定义Adapter的基本用法,还能提升处理复杂界面设计的能力。

    Android之自定义Adapter的ListView

    自定义Adapter是为了更灵活地控制ListView中的每个列表项的行为和外观。在自定义Adapter时,我们需要实现四个核心方法:`getCount()`、`getItem(int position)`、`getItemId(int position)`和`getView(int position,...

    ListView中使用自定义Adapter及时更新数据

    本篇将详细讲解如何在ListView中使用自定义Adapter来实现数据的及时更新。 首先,我们需要理解ListView的工作原理。ListView通过Adapter来与数据源进行交互,Adapter是连接数据集和视图的桥梁。它负责从数据集中...

    自定义Adapter适应ListView和GridView

    自定义Adapter可以让我们更自由地控制数据如何显示,以及实现特定的功能,如点击事件处理、动画效果等。 自定义Adapter的基本步骤如下: 1. 创建一个新的类,继承自BaseAdapter。BaseAdapter是Adapter的一个基础类...

    Android ListView自定义Adapter实现仿QQ界面

    Android ListView自定义Adapter实现仿QQ界面是一种常见的Android应用程序开发技术,通过自定义Adapter可以满足用户的个性化需求,提供更多的显示样式和交互方式。自定义Adapter的优点包括个性化需求、灵活性强和性能...

    Flutter学习之旅(六)----ListView控件自定义Adapter以及带参数跳转

    Flutter学习之旅(六)----ListView控件自定义Adapter以及带参数跳转,博客对应地址:http://blog.csdn.net/zhangxiangliang2/article/details/76383244

    Android自定义Adapter适配器

    本项目聚焦于自定义Adapter的实现,特别是如何将其应用于ListView的数据显示。 首先,理解Adapter的基本原理是关键。Adapter是一个接口,它的主要职责是将数据模型转换为视图,以便在UI组件如ListView、GridView或...

    自定义listview的item控件

    这个过程涉及到Android的视图复用机制、数据绑定以及事件处理等多个核心知识点。 1. **Adapter原理**: Android的ListView工作基于Adapter模式,它作为数据源与ListView视图之间的桥梁。Adapter负责从数据源(如...

    Android中ListView+Adapter

    如果你需要自定义视图或者处理复杂数据模型,通常会继承BaseAdapter。你需要实现其中的几个关键方法,如`getCount()`(返回数据源大小),`getItem(int position)`(获取指定位置的项),`getView(int position, ...

    5-ListView-SimpleAdapter及自定义Adapter-进阶2.rar

    10. **多类型列表项**: 如果ListView需要显示不同类型的列表项,自定义Adapter可以通过在`getViewTypeCount()`和`getItemViewType(int position)`方法中添加逻辑来处理。 综上所述,理解并熟练运用SimpleAdapter和...

    GridView用自定义Adapter

    如果需要对GridView的点击事件进行处理,可以在自定义Adapter的`getView()`方法中为每个View设置OnClickListener,或者在GridView本身设置OnItemClickListener。 通过以上步骤,我们就能创建一个能够满足特定需求...

    ListView的自定义适配器Adapter

    为了使ListView显示的数据更加丰富多样,我们通常需要自定义适配器(Adapter)。本文将深入探讨如何创建和使用ListView的自定义适配器,以及它的工作原理。 首先,我们要理解适配器在ListView中的角色。适配器是...

    在ListView中自定义Adapter

    为便于学习自定义的Adapter,本案例的界面未进行美化,功能已经实现,对于其中的getView(int position,View view ,ViewGroup vg)做了数据的填充操作。本案例功能及其简单,只涉及ListView中自定义适配器,没有对...

    android listview 自定义样式实例

    - 创建并实例化自定义的Adapter后,将其设置到ListView上,通过`listView.setAdapter(adapter)`来完成。 6. **监听器(Listeners)**: - 可能需要设置点击事件监听器,如`OnItemClickListener`,以便当用户点击...

Global site tag (gtag.js) - Google Analytics