Android开发:仿美团下拉列表菜单,帮助类,复用简单
近期在项目中须要用到下拉菜单。公司比較推崇美团的下拉菜单,于是要实现该功能。想着。这个功能应该是一个常常会用到的。于是何不写一个帮助类,仅仅要往这个类里面传入特定的參数,既能够实现下来菜单,并且还能够实现菜单选择的回调。既能够反复使用,有简单便捷
首先,查看界面效果图
界面倒是比較简单,主要列下功能:
- 这个是靠一个帮助类实现的。下次想在自己的项目中实现该功能,一句引用代码,传入特定的參数既能够实现该功能
- 菜单弹出的时候。背景变灰色。菜单收回,背景回复白色
- 自己主动给选定的选项加入背景色,假设下次选择的其它选项,背景色自己主动切换
- 回调菜单的选择项
public class MenuHelper {
private PopupWindow popupWindow;
private ListView listView;
private List<String> data;
private Context mContext;
private View topView;
private ListAdapter adapter;
private int i = 0;
private FrameLayout container;
public MenuHelper(Context context, View topView, final OnMenuClick clickListener, List<String> data, FrameLayout containerView) {
mContext = context;
this.topView = topView;
this.data = data;
this.container = containerView;
container.getForeground().setAlpha(0);
topView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showMenu();
}
});
initListView(clickListener);
initPopupWindow();
}
private void initListView(final OnMenuClick clickListener) {
listView = new ListView(mContext);
listView.setDivider(null);
listView.setDividerHeight(0);
listView.setBackgroundColor(Color.WHITE);
adapter = new ListAdapter(mContext);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?
> parent, View view,
int position, long id) {
i = position;
clickListener.onPopupMenuClick(position);
popupWindow.dismiss();
}
});
}
private void initPopupWindow() {
popupWindow = new PopupWindow(listView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
popupWindow.setOutsideTouchable(true);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
popupWindow.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
if (container != null) {
container.getForeground().setAlpha(0);
}
}
});
}
public void showMenu() {
adapter.notifyDataSetChanged();
if (popupWindow.isShowing()) {
popupWindow.dismiss();
}else {
popupWindow.setOutsideTouchable(true);
popupWindow.setTouchable(true);
popupWindow.showAsDropDown(topView, 0, 0);
if (container != null) {
container.getForeground().setAlpha(120);
}
}
}
private class ListAdapter extends ArrayAdapter<String> {
public ListAdapter(Context context) {
super(context, R.layout.item_text, data);
}
private Holder getHolder(final View view) {
Holder holder = (Holder) view.getTag();
if (holder == null) {
holder = new Holder(view);
view.setTag(holder);
}
return holder;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
rowView = inflater.inflate(R.layout.item_text, null);
}
final Holder holder = getHolder(rowView);
holder.textview.setText(data.get(position));
if (position == i) {
holder.textview.setBackgroundColor(mContext.getResources().getColor(R.color.item_press));
}else {
holder.textview.setBackgroundColor(Color.TRANSPARENT);
}
return rowView;
}
private class Holder {
public TextView textview;
public Holder(View view) {
textview = (TextView) view.findViewById(R.id.textView);
}
}
}
}
public interface OnMenuClick {
public void onPopupMenuClick(int position);
}
最后,是MainActivity的代码:
public class MainActivity extends Activity implements OnMenuClick{
private MenuHelper mMenuHelper;
private Button button;
private FrameLayout container;
private List<String> menuData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
container = (FrameLayout) findViewById(R.id.container);
button = (Button) findViewById(R.id.button);
menuData = new ArrayList<String>();
menuData.add("ladfj");
menuData.add("ladfj");
menuData.add("ladfj");
menuData.add("ladfj");
menuData.add("ladfj");
mMenuHelper = new MenuHelper(this, button, this, menuData, container);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mMenuHelper.showMenu();
}
});
}
@Override
public void onPopupMenuClick(int position) {
Log.d("debug", "click position " + position);
}
}
Android开发:仿美团下拉列表菜单,帮助类,复用简单的更多相关文章
- Android开发之多级下拉列表菜单实现(仿美团,淘宝等)
注:本文转载于:http://blog.csdn.net/minimicall/article/details/39484493 我们在常用的电商或者旅游APP中,例如美团,手机淘宝等等,都能够看的到 ...
- Android开发 ---xml构建选项菜单、上下文菜单(长按显示菜单)、发通知、发送下载通知
1.activity_main.xml 描述: 定义了一个TextView和三个按钮 <?xml version="1.0" encoding="utf-8&quo ...
- Android开发精彩博文收藏——UI界面类
本文收集整理Android开发中关于UI界面的相关精华博文,共大家参考!本文不定期更新! 1. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各 ...
- Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单
1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...
- Android--------WebView+H5开发仿美团 预加载,加载失败和重新加载
Android嵌入式开发已经占大多数了,很多界面都是以网页的形式展示,WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用. 本博客主要是模仿美团的旅游出行模块的预加载,网页加载失 ...
- 【Android开发】问答机器人,聊天类App的开发制作过程记录
缘起 很久没写项目了,所以单纯的想练练手,正好看到有问答机器人的接口,想到之前也做过聊天项目,为什么不实验一下呢.当然也是简单调用接口的项目,并没有真正的完成问答的算法等等.业余项目,功能不齐全,只实 ...
- Android开发--仿微信语音对讲录音
原文地址:http://www.2cto.com/kf/201502/378704.html 自微信出现以来取得了很好的成绩,语音对讲的实现更加方便了人与人之间的交流.今天来实践一下微信的语音对讲的录 ...
- android开发之使用上下文菜单
android中的上下文菜单类似于PC上的鼠标右键单击,不同的是android上没有鼠标这一概念,更谈不上右键单击,在android中,一般是长按某个View,调出上下文菜单.与OptionsMenu ...
- android 开发-(Contextual Menu)上下文菜单的实现
在android3.0以后,安卓设备不在提供物理的菜单按键,同时,android应用提供了另外的菜单实现机制,来替代之前的菜单创建方式.安卓设备中,平常可以使用长按住某个内容弹出菜单选项.这就是我们需 ...
随机推荐
- xml json
简单概括的话就是,xml本身是一种格式规范,是一种包含了数据以及数据说明的文本格式规范. 比如,我们要给对方传输一段数据,数据内容是“too young,too simple,sometimes na ...
- 叉积(POJ - 2318 )
题目链接:https://cn.vjudge.net/contest/276358#problem/A 题目大意:给你一个矩阵的左上角和右下角,然后n个竖杠,这n个竖杠将这个矩阵分成n+1个方块,给你 ...
- 分模块开发创建dao子模块——(七)
1.选中父工程右键新建maven module
- oracle 级联查询 根路径
级联查询有很多教程示例,但是没有找到求特定子孙到根的路径的例子,折腾了一番总算想出方法了. 现假设我们拥有一个菜单表t_menu,其中只有三个字段:id.name和parent_id.它们是具有父子关 ...
- 底板芯片组与内存映射(Motherboard Chipsets and the Memory Map) 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4194650.html 底板芯片组与内存映射 我打算写一些关于计算机内部构造(computer intern ...
- python运行execjs解密js
[转]http://www.knowsky.com/1041161.html python 记一次计算qzonetoken经历 之前用python写了个发表说说的爬虫,但最近发现在post数据时返回不 ...
- 大数据系列之分布式计算批处理引擎MapReduce实践-排序
清明刚过,该来学习点新的知识点了. 上次说到关于MapReduce对于文本中词频的统计使用WordCount.如果还有同学不熟悉的可以参考博文大数据系列之分布式计算批处理引擎MapReduce实践. ...
- 消息监听器无法注入bean
问题描述: 在activemq的监听器中,通过注解@Autowired或@Resource注入bean时,获取到的bean为null.调用该bean的方法时会报空指针异常. 问题原因: 当调用bean ...
- 细说MySQL备份的基本原理(系列一 ) 备份与锁
数据库作为一个系统中唯一或者主要的持久化组件,对服务的可用性和数据的可靠性要求极高. 作为能够有效应对因为系统软硬件故障.人工误操作导致数据丢失的预防手段,备份是目前最为常见的数据库运维操作. 考虑到 ...
- linux文本编码格式转化 字幕处理
在处理字幕的时候,linux的编码格式转换很烦. 步骤: 用python先判断 其编码,再用iconv 转编码,再用awk处理格式. file不能判断吗?file有时不准. 1.python判断编码 ...