Android 仿微信长按列表弹出PopupMenu菜单栏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 仿微信长按列表弹出PopupMenu菜单栏相关的知识,希望对你有一定的参考价值。

参考技术A 弹出效果如下图所示

可以使用setGravity()方法来指定弹出窗口与anchor视图的对齐方式,例如修改对齐方式为Gravity.END

使用起来还是比较简单的,但是好像大部分项目的需求是PopupMenu在用户点击的位置弹出,然而PopupMenu并没有提供在指定坐标弹出的方法,所以只能咱们自己来实现咯!

想让PopupMenu在指定弹出位置,首先咱们得先了解show()方法是如何让PopupMenu弹出来的,所以只能去阅读源码了(Read The Fucking Source Code~)。

PopupMenu的show()方法很简单,直接把任务转给MenuPopupHelper来处理,处理流程:show() -> tryShow() -> showPopup(0, 0, false, false);

我们可以看到showPopup方法内有两个参数int xOffset、int yOffset,根据注释可以知道这就是相对于anchor视图的坐标值。所以如果要指定PopupMenu的弹出位置,MenuPopupHelper应该这样处理弹出逻辑:show(int x, int y) -> tryShow(int x, int y) -> showPopup(x, y, true, true)。

但是由于PopupMenu无法调用到MenuPopupHelper的show(int x, int y) 方法,因此我们只能使用反射机制绕过PopupMenu,直接调用MenuPopupHelper的show(int x, int y)方法。

到此为止,已经有了大致的解决思路,接下来看看具体实现。

最终弹出效果如下图所示

Android Item长按弹出删除,点击删除执行删除对应的文件

我用ArrayList的方式显示了存储卡某个文件件内的文件的列表,AdapterView添加了点击的事件,但是我想添加一个长按点击弹出菜单,里面有删除按钮,点击删除按钮删除对应的文件夹内的那个文件,并刷新列表。我现在遇到的问题是,我怎么获取那个文件的地址,这个是最大的问题。希望高手们能给小弟一个Demo或者一些指点,我刚接触Android,谢谢
我简单的贴了下代码,希望各位帮我看下行么?在网盘中
http://pan.baidu.com/share/link?shareid=738293995&uk=706528506
谢谢了

public class MyAdapter extends BaseAdapter 

@Override
public int getCount() 
return list.size();


@Override
public Object getItem(int arg0) 
return list.get(arg0);


@Override
public long getItemId(int arg0) 
return arg0;


@Override//最主要的重写方法
public View getView(int arg0, View arg1, ViewGroup arg2) 
View view = View.inflate(显示list的Activity.this,
ListView的item是个xml布局文件(R.layout.????), null);
Button bt_enter = (Button) view.findViewById(R.id.bt_enter);
//获取ListView的一个控件,这里面获取了一个Button
//注意看,有一个参数int arg0,这个参数很重要是这个item在listView的位置
//声明一个final的值,并把arg0的值赋值给他
final int position=arg0;
bt_enter.setOnClickListener(new OnclickListenner()
//重写方法,你懂的
//在这里就可以操作position对应的条目
);
return view;

写一个内部类,Myadapter继承BaseAdapter,在需要把listView适配的地方listView.setAdapter(new MyAdapter());

参考技术A 你是怎么得到文件名的??怎么会没有路径
你在取文件名的时候,把它的完整路径也加入一个ArrayList,点击的时候用position去删除
参考技术B 先把Item对应position的信息保存了 长按事件得到position再做操作 参考技术C 文件的地址就是你的Listview填充的数据的某一项,你可以通过监听里的position去定位.demo你可以去eoe,csdn,oschina等社区找. 参考技术D listView.setOnItemLongClickListener(new OnItemLongClickListener()

@Override
public boolean onItemLongClick(AdapterView<?> arg0, View view,
int position, long id)
DeleteDialog();
return false;

);
/**
* 退出系统确认框
*/
private void DeleteDialog()
AlertDialog.Builder builder = new Builder(ShowActivity.this);

builder.setMessage("确定删除文件?");
builder.setTitle("提示");

builder.setPositiveButton("确定", new DialogInterface.OnClickListener()

@Override
public void onClick(DialogInterface dialog, int which)
//这里File构造方法参数就是从你list读取的文件路径
File file = new File(listItem.get(index));
file.delete();
//通知adapter 更新
adapter = new AAAdapter(this, list);
listView.setAdapter(adapter);

);

builder.setNegativeButton("取消", new DialogInterface.OnClickListener()

@Override
public void onClick(DialogInterface dialog, int which)


);
builder.create().show();


//文件路径你不是保存在list里了,通过positon 直接拿就OK了。。。。本回答被提问者和网友采纳

以上是关于Android 仿微信长按列表弹出PopupMenu菜单栏的主要内容,如果未能解决你的问题,请参考以下文章

android微信的聊天记录长按某聊天弹出的页面是怎样实现的

Android Item长按弹出删除,点击删除执行删除对应的文件

微信公众号里,长按指纹或者二维码,一键关注怎么设置?怎么写标题?怎么多涨粉丝?

android 长按事件 和 长按弹出上下文菜单如何处理

JCameraView 仿微信拍照Android控件(点击拍照,长按录小视频)

android 仿微信demo————微信顶部操作栏加号按钮实现(弹出子菜单)