Android开发:仿美团下拉列表菜单,帮助类,复用简单

Android开发:仿美团下拉列表菜单,帮助类,复用简单

大家好,又见面了,我是全栈君。

近期在项目中须要用到下拉菜单。公司比較推崇美团的下拉菜单,于是要实现该功能。想着。这个功能应该是一个常常会用到的。于是何不写一个帮助类,仅仅要往这个类里面传入特定的參数,既能够实现下来菜单,并且还能够实现菜单选择的回调。既能够反复使用,有简单便捷

首先,查看界面效果图

Android开发:仿美团下拉列表菜单,帮助类,复用简单

Android开发:仿美团下拉列表菜单,帮助类,复用简单

界面倒是比較简单,主要列下功能:

  1. 这个是靠一个帮助类实现的。下次想在自己的项目中实现该功能,一句引用代码,传入特定的參数既能够实现该功能
  2. 菜单弹出的时候。背景变灰色。菜单收回,背景回复白色
  3. 自己主动给选定的选项加入背景色,假设下次选择的其它选项,背景色自己主动切换
  4. 回调菜单的选择项
假设你须要的是一级选择菜单,如上的功能是全然足够了,好了,一下是代码部分:

下拉菜单的帮助类:MenuHelper
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); } } }}


代码都比較简单,构造函数须要传的參数中的containerView是一个须要变灰色效果的Layout。你能够传或者设置null

以下是回调接口
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开发之多级下拉列表菜单实现(仿美团,淘宝等)http://blog.csdn.net/minimicall/article/details/39484493

Blur or dim background when Android PopupWindow active   http://stackoverflow.com/questions/3221488/blur-or-dim-background-when-android-popupwindow-active






版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115247.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月7日 上午6:00
下一篇 2022年2月7日 上午7:00


相关推荐

  • 交叉编译lrzsz

    交叉编译lrzsz参考:https://blog.csdn.net/linucos/article/details/5582979https://blog.csdn.net/wangzhen209/article/details/32713715https://blog.csdn.net/zijie_xiao/article/details/50934279步骤:获取源码:https://www…

    2022年6月23日
    41
  • Git 工具 – 高级合并「建议收藏」

    高级合并在Git中合并是相当容易的。因为Git使多次合并另一个分支变得很容易,这意味着你可以有一个始终保持最新的长期分支,经常解决小的冲突,比在一系列提交后解决一个巨大的冲突要好。然而,有时也会有棘手的冲突。不像其他的版本控制系统,Git并不会尝试过于聪明的合并冲突解决方案。Git的哲学是聪明地决定无歧义的合并方案,但是如果有冲突,它不会尝试智能地自动解决它。因此,如果很久之后才合并两个分叉的分支,你可能会撞上一些问题。在本节中,我们将会仔细查看那些问题是什么以及Git

    2022年4月6日
    76
  • 信号驱动IO异步IO的对比理解刨析, epoll地ET,LT

    信号驱动IO异步IO的对比理解刨析, epoll地ET,LT信号驱动 IO 异步 IO 的对比理解刨析 代码实现信号驱动 IO 以及 select poll epoll 三个 IO 多路复用技术的原理再生活化理解 以及细谈一下 epoll 的 LT 和 ET

    2026年3月19日
    2
  • 抓包工具charles下载安装(破解版)

    抓包工具charles下载安装(破解版)1.下载:下载地址:https://www.charlesproxy.com/latest-release/download.do我的电脑是64位的,所以选择红框中的。2.下载之后安装按照默认next即可,然后选择路径。3.Charles破解破解地址:https://www.zzzmode.com/mytools/charles/按照下方文字填好,点击生成,会生成一个jar包,这个…

    2022年5月1日
    53
  • php .asmx,php实现通过soap调用.Net的WebService asmx文件

    php .asmx,php实现通过soap调用.Net的WebService asmx文件本文实例讲述了php实现通过soap调用.Net的WebServiceasmx文件。分享给大家供大家参考,具体如下:最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各种探索,相关的PHP调用webservice的过程如下:1.打开php相关扩展:找到配置文件php.ini文件,打开以下扩展extension=php_so…

    2022年6月8日
    33
  • Pycharm新手教程,只需要看这篇就够了

    Pycharm新手教程,只需要看这篇就够了pycharm 是一款高效的 pythonIDE 工具 它非常强大 且可以跨平台 是新手首选工具 下面我给第一次使用这款软件的朋友做一个简单的使用教程 希望能给你带来帮助 目前 pycharm 一共有两个版本 Professional 专业版本 和 社区版 专业版功能最强大 主要是为 Python 和 web 开发者而准备 是需要付费的 社区版是专业版的阉割版 比较轻量级 主要是为 Python 和数据专家而准备的 一般我们做开发 下载专业版本比较合适 文章转自 django 中文网 Pychar

    2026年3月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号