`

ListView的长按菜单___源码分析

 
阅读更多
ListView的长按菜单___源码分析

Android的listview可以长按弹出来一个菜单。
今天就跟了下代码大概看了下弹出菜单的流程。
我们实现一个菜单长按步骤通常如下:

1.弹出菜单的生成
如果控制listview长按应该生成什么样的菜单。
a、生成一个OnCreateContextMenuListener的接口对象
该接口定义如下:在view.java中
public interface OnCreateContextMenuListener {  
    /** 
     * Called when the context menu for this view is being built. It is not 
     * safe to hold onto the menu after this method returns. 
     * 
     * @param menu The context menu that is being built 
     * @param v The view for which the context menu is being built 
     * @param menuInfo Extra information about the item for which the 
     *            context menu should be shown. This information will vary 
     *            depending on the class of v. 
     */  
    void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo);  
} 


b、实现该接口的onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)函数
在这里,根据menuInfo,通常先转换为AdapterContextMenuInfo,定义如下,在adapterview.java中定义
public static class AdapterContextMenuInfo implements ContextMenu.ContextMenuInfo { 
 
    public AdapterContextMenuInfo(View targetView, int position, long id) {  
        this.targetView = targetView;  
        this.position = position;  
        this.id = id;  
    }  
 
    /** 
     * The child view for which the context menu is being displayed. This 
     * will be one of the children of this AdapterView. 
     */  
    public View targetView;  
 
    /** 
     * The position in the adapter for which the context menu is being 
     * displayed. 
     */  
    public int position;  
 
    /** 
     * The row id of the item for which the context menu is being displayed. 
     */  
    public long id;  
}


通过获取MenuItem 的postion进而获取该listitem的信息,进而来决定加入什么样的菜单。

c、将该接口对象设置为listview的listener
setOnCreateContextMenuListener(l)



2、菜单选择事件的响应
实现该listview的单击响应事件
public boolean onContextItemSelected(MenuItem item) {}

根据不同的MenuItem的id来进行不同的操作。

二、onCreateContextMenu的调用
那么OnCreateContextMenuListener的onCreateContextMenu是在什么时候调用的呢
是在view.java中createContextMenu函数中调用。
view.createContextMenu是在ContextMenubuilder的show函数调用
而ContextMenubuilder的show函数分别在
PhoneWindow和MidWindow的showContextMenuForChild调用。
再往下今天就没再跟下去了。

三、onCreateContextMenu的生成
在onCreateContextMenu(menu, this, menuInfo)时,传入一个MenuInfo,我们就根据这个MenuInfo来创建响应的菜单。

那这个MenuInfo是怎样生成的呢?
1、首先在View中createContextMenu,调用ContextMenuInfo menuInfo = getContextMenuInfo();

但是getContextMenuInfo()就是返回一个空,得不得我们的数据。

所以,一个view要想能够生成自己的MenuInfo,必须要重新getContextMenuInfo这个函数。
2、在上面的步骤中,我们没有涉及到该函数的重写 ,是因为ListView的父类中,已经重写了改函数 。如下
@Override
protected ContextMenuInfo getContextMenuInfo() {  
    return mContextMenuInfo;  
} 

而这个成员变量的赋值如下:
private boolean performLongPress(final View child,final int longPressPosition, final long longPressId) {  
    boolean handled = false;  
    if (mOnItemLongClickListener != null) {  
        handled = mOnItemLongClickListener.onItemLongClick(AbsListView.this, child,  
                longPressPosition, longPressId);  
    }  
 
    if (!handled) {  
        mContextMenuInfo = createContextMenuInfo(child, longPressPosition, longPressId);  
        handled = super.showContextMenuForChild(AbsListView.this);  
    } 
 
    if (handled) {  
        performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);  
    } 
 
    return handled;  
}
  
ContextMenuInfo createContextMenuInfo(View view, int position, long id) {  
    return new AdapterContextMenuInfo(view, position, id);  
} 
 
ContextMenuInfo createContextMenuInfo(View view, int position, long id) {  
    return new AdapterContextMenuInfo(view, position, id);  
}


就是我们在构造菜单时候所用到的ContextMenuInfo.

如果我们要给其它自己定义的View,响应长按菜单。这时候我们就需要重写该View的getContextMenuInfo()。

根据View当前状态生成不同的ContextMenuInfo,进而决定应该弹出什么样的菜单。


分享到:
评论
1 楼 mm4409092 2012-05-05  
android listview综合使用示例_结合数据库操作和listitem单击长按等事件处理
http://blog.csdn.net/lk_blog/article/details/7537200

相关推荐

    安卓Andriod源码——ContextMenu上下文选项菜单,长按后跳出菜单.zip

    这个"安卓Andriod源码——ContextMenu上下文选项菜单,长按后跳出菜单.zip"文件很可能是包含了一个示例项目,用于演示如何在Android应用中实现ContextMenu的功能。下面我们将深入探讨ContextMenu的实现机制、使用...

    安卓Android源码——ContextMenu 上下文选项菜单,长按后跳出菜单.rar

    这个压缩包“安卓Android源码——ContextMenu 上下文选项菜单,长按后跳出菜单.rar”包含了实现这一功能的源代码示例,名为ContextMenuDemo,下面将详细介绍其背后的原理和实现方式。 首先,理解ContextMenu的基本...

    安卓Android源码——ContextMenu上下文选项菜单,长按后跳出菜单.zip

    这个压缩包文件"安卓Android源码——ContextMenu上下文选项菜单,长按后跳出菜单.zip"包含了一个名为"ContextMenuDemo"的示例项目,用于演示如何在应用程序中实现`ContextMenu`。 首先,让我们理解`ContextMenu`的...

    ContextMenu 上下文选项菜单,长按后跳出菜单.zip

    通过分析源码,你可以了解到ContextMenu的生命周期以及它如何与Activity和View协同工作。 此外,了解`ContextMenu.ContextMenuInfo`接口也很关键,这个接口提供了关于触发ContextMenu的视图的额外信息,比如在...

    Android手势研究(textview及listview对比验证)(二)

    在博客中,作者可能对比了TextView和ListView在处理滑动手势时的差异,分析了在不同场景下哪种组件更适合添加特定手势,以及如何通过源码分析优化手势识别的性能。同时,博客可能还涉及了一些实用工具,如...

    Android高级应用源码-实现列表多选的DEMO.zip

    这个"Android高级应用源码-实现列表多选的DEMO.zip"应该包含了一个完整的示例项目,展示了如何在Android中实现ListView或者RecyclerView的多选功能。下面将详细讲解这一知识点。 1. **ListView与RecyclerView**: ...

    Android应用源码之MyContextMenu.zip

    通过分析源码,开发者可以深入理解上下文菜单的工作机制,学习如何根据需要添加自定义逻辑,比如添加菜单项的图标、处理点击事件等。 此外,源码中可能会涉及其他关键概念,例如事件监听、数据绑定、UI更新等,这些...

    应用源码之MyContextMenu.zip

    通过深入分析"MyContextMenu"的源码,我们可以了解到如何在实际项目中灵活运用上下文菜单,提高用户体验。同时,这也是一种很好的学习和实践Java编程、Android框架和UI设计的机会,对于毕业设计或提升个人技能都有很...

    嵌入式实验报告

    - 点击Menu按钮后进入菜单界面,长按菜单项时出现上下文菜单,点击后可以看到程序响应。 - 返回主界面,点击ListView按钮进入列表视图界面,点击列表项后程序做出响应。 #### 5. 自选综合设计考核报告 ##### 5.1 ...

    ZrcListView改进版

    通过阅读和分析源码,我们可以深入理解其内部工作机制,包括长按功能的实现细节、下拉刷新和上拉加载更多的逻辑,以及如何处理触摸事件等。 为了充分利用ZrcListView,开发者需要了解以下几个方面: - **适配器...

    FileManager_android_

    本篇将深入探讨一个名为"FileManager_android_"的开源项目,通过分析其源码,我们将了解如何构建一个功能完善的Android文件浏览器。 首先,我们要理解Android文件系统的结构。Android基于Linux内核,因此其文件系统...

    android 各种特效 源码 demo

    源码分析可以帮助开发者理解如何集成这些功能到自己的ListView或RecyclerView中。 5. **自定义View**:为了实现独特的视觉效果,开发者常常需要创建自定义View。源码可能包含了一些自定义View的示例,如圆形头像、...

    android 目录管理器 源码

    源码分析: 1. **Activity与UI组件**: Android应用的核心是Activity,它是用户界面的主要载体。目录管理器的源码中,通常会有一个主Activity负责显示文件目录树。这个Activity可能使用ListView或RecyclerView来...

    Android 仿ES界面文件浏览器源码.zip

    【Android 仿ES界面文件浏览器源码分析】 在Android开发中,实现一个功能完善的文件浏览器是许多应用必不可少的一部分,尤其当需要用户能够浏览和管理本地文件时。"Android 仿ES界面文件浏览器源码"是一个典型的...

    Android高级应用源码-文件浏览返回路径.rar

    为了提升用户体验,可能还实现了长按菜单、拖放操作、搜索功能等。 8. **适配多种设备**:Android设备有各种屏幕尺寸和分辨率,因此源码可能包含了对不同屏幕大小的适配,如使用比例尺寸单位(dp、sp)和使用布局...

    android应用源码仿小米便签源码.zip

    5. **用户交互**:源码中还可能包含触摸事件处理、长按菜单、滑动删除等功能的实现,这些都是Android中常见的用户交互设计。 6. **通知与提醒**:如果具备定时提醒功能,那么会有AlarmManager和服务(Service)来...

    Android FileManager文件管理器源码

    通过分析和学习Android FileManager的源码,开发者不仅可以掌握文件操作的基础知识,还能了解到Android系统的文件权限管理、Intent交互、UI设计等方面的内容,对于提升Android应用开发技能大有裨益。同时,这也有助...

    手机QQ6.1版本 聊天功能源码

    源码中会有触摸事件的处理,如滑动查看历史消息、长按消息的弹出菜单等。 9. **网络状态监测**:为了确保在网络不稳定时仍能正常运行,源码会包含网络状态监测的代码,比如使用BroadcastReceiver监听网络连接变化。...

Global site tag (gtag.js) - Google Analytics