Context Menu的使用+为ListView绑定监听器——开源项目Standup Timer学习总结(二)

android的context menu上下文菜单,长按某一选项,就会显示出来。

SDK上的描述:Context Menu A floating list of menu items that appears when the user performs a long-press on a View.

(一)Standup Timer中的例子

使用步骤

  ContextMenu的使用也比较简单和OptionsMenu相似,先添加XML文件,然后重载对应的方法成员。
  首先在res文件夹下新建menu目录,然后往里面添加menu的XML 文件。OptionsMenu  和 ContextMenu格式的是一样的。
   
   
< menu xmlns:android ="http://schemas.android.com/apk/res/android" >
< item android:id ="@+id/deleteTeam" android:title ="@string/delete"
android:icon
="@android:drawable/ic_menu_delete" />
</ menu >

 

  item:每一个item对应一项菜单。
  android:icon:用于指定菜单显示的图标。
  android:title:菜单的标题,显示在图标下面。
  关于Menu的更多属性设置请查看SDK上的  Menu Resource
  第二步是重写  onCreateContextMenu方法。
复制代码
代码
    
    
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {

super .onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater
= getMenuInflater();
inflater.inflate(R.menu.meetings_context_menu, menu);
}
复制代码

 

接下来是处理菜单的点击事件
复制代码
代码
    
    
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info
= (AdapterContextMenuInfo) item
.getMenuInfo();
switch (item.getItemId()) {
case R.id.delete_meeting:
postionOfMeetingToDelete
= info.position;
showDialog(CONFIRM_DELETE_MEETING_DIALOG);
return true ;
default :
return super .onContextItemSelected(item);
}
}
复制代码

 

这里我们使用 AdapterContextMenuInfo 来获取上下文菜单 获取对应VIEW 的信息。.position 在这里返回了ListActivity中的位置,
  The position in the adapter for which the context menu is being displayed.

注册菜单

  ContextMenu和OptionsMenu主菜单不同的是上下文菜单需要使用registerForContextMenu进行注册,否则将无法显示。
复制代码
代码
    
    
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.teams);
// 将右键菜单注册给List 控件
registerForContextMenu(getListView());
}
复制代码

 

(二)我的项目 :移动图书馆   中的例子

通过学习上面的开源项目之后,自由也完善了正在做的项目:

输入关键字进行搜索之后,进去结果显示界面,然后通过对每一个ListView绑定单击监听器和长按截听器(集Context Menu)。

首先第一步,绑定单击监听器

        list =  (ListView)findViewById(R.id.mylist);
         list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				//通过getItemAtPosition()判断点击的是哪个item,然后强制转化为所某一类型,
				//总的来说,如若需要重写ListView中的onListItemClick(即响应该项被单击),获取该具体项时,
                               //其类型由构造ListView的适配器决定。
				HashMap<String,String> t = (HashMap<String,String>) arg0.getItemAtPosition(arg2);
				Toast.makeText(getApplicationContext(), t.get("bookName"),Toast.LENGTH_SHORT).show();
			}
        	
         });
     总的来说,如若需要重写ListView中的onListItemClick(即响应该项被单击),获取该具体项时,其类型由构造ListView的适配器决定。我的使用的是SimpleAdapter。

 //创建适配器
        SimpleAdapter sa = new SimpleAdapter(
        		this,
        		booklist,
        		R.layout.main,
        		new String [] {"bookName","bookAuthor","press","date","preserveNum","lendableNum","manageNum"} ,
        		new int [] {R.id.bookmane,R.id.author,R.id.press,R.id.date,R.id.preserve,R.id.lendable,R.id.manage}
        		);

因为booklist的声明为:List<HashMap<String,String>> booklist;所以上面的t需要强制转化为HashMap<String ,String>类型。
HashMap<String,String> t = (HashMap<String,String>) arg0.getItemAtPosition(arg2);
单击某项时,效果如下:


第二步,创建Conttext Menu.

覆盖以下两个方法:

@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.booklist_context, menu);
	}

	@Override
	public boolean onContextItemSelected(MenuItem item) {
		switch(item.getItemId()){
		case R.id.buy_book:
			Toast.makeText(this, "点击了购书推荐",3000).show();			
			return true;
		case R.id.detail:
			Toast.makeText(this, "点击了书籍详细信息",3000).show();
			return true;
		default:
			return super.onContextItemSelected(item);
		}
	}

最后当然不要忘记了在onCreate()方法中注册:

registerForContextMenu(list);


当长按某一项时效果如下:

 

选择以上的一个选项时,效果如下:








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值