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);

		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

时间: 2024-11-10 14:15:29

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

Android开发之多级下拉列表菜单实现(仿美团,淘宝等)

我们在常用的电商或者旅游APP中,例如美团,手机淘宝等等,都能够看的到有那种下拉式的二级列表菜单.具体如图所示: 上面两张图就是美团的一个二级列表菜单的一个展示.我相信很多人都想开发一个跟它一样的功能放到自己的APP中.好,接下来我们就开始动手,解决它. 1,结构分析 首先,我们给出这个下来菜单需要的组建.我们用线框图来分析. 1)如上图所示,最外围的是一个Activity,顶部包含了一个View的容器,这个容器主要是装载ToggleButton来实现诸如美团里面的"美食,全城,理我最近,刷选&

仿美团二级菜单

最近要做一个仿美团似的二级菜单 在csdn上找了demo 下载下来有错误不能运行   自己又整理了一下  终于可以运行实现效果了.布局xml就不贴出代码了,demo可以去csdn去下载:(后续补上链接) 1)分析思路,最外围的是一个Activity,顶部包含了一个View的容器,这个容器主要是装载ToggleButton来实现诸如美团里面的“美食,全城,理我最近,刷选”这一行.这一行一点就会弹出对应的下来菜单. 2)下拉菜单是如何实现的呢?,这里我们利用了PopupWindow来实现这一弹出式窗

Android开发--仿景点通景区地图SurfaceView实现

最近在帮老师做一个项目,类似于景点通的App手机应用,我们是要精细化一些室内的地图,室内的地图采用的是自己的一套定位机制,所有室内地图也要自己来实现,参考了网上一些例子,考虑到效率的问题,最后决定使用SurfaceView来进行地图绘制,实现的功能有: 双击放大 多点触摸放大 地图拖拽 添加地图标记 效果图一张: 代码思路 1.处理缩放和拖拽事件 在这里我利用了Matrix类提供的图片操作方法去进行图片的缩放和平移处理,关于该方面的知识可以参考 Android开发–利用Matrix进行图片操作

android开发之使用上下文菜单

android中的上下文菜单类似于PC上的鼠标右键单击,不同的是android上没有鼠标这一概念,更谈不上右键单击,在android中,一般是长按某个View,调出上下文菜单.与OptionsMenu不同的是,ContextMenu是一个针对View的菜单,它绑定在某一个View上,而OptionsMenu是属于一个Activity的. 现在大部分浏览器都有长按复制的功能,如下图: 这种效果的实现是使用PopupWindow来实现的(关于PopupWindow的使用可以参见我的另一篇文章popu

Android开发--仿微信语音对讲录音

自微信出现以来取得了很好的成绩,语音对讲的实现更加方便了人与人之间的交流.今天来实践一下微信的语音对讲的录音实现,这个也比较容易实现.在此,我将该按钮封装成为一个控件,并通过策略模式的方式实现录音和界面的解耦合,以方便我们在实际情况中对录音方法的不同需求(例如想要实现wav格式的编码时我们也就不能再使用MediaRecorder,而只能使用AudioRecord进行处理). 效果图: 实现思路 1.在微信中我们可以看到实现语音对讲的是通过点按按钮来完成的,因此在这里我选择重新自己的控件使其继承自

Android开发中相见恨晚的方法、类或接口

摘抄.整理加个人总结,感谢所有参与者! 1.      Resources类中的getIndentifier(name,defType,defPackage)方法,根据资源名次获取其ID: 2.      Array类中的asList(T-array)方法,数组转List集合: 3.      View类的callOnClick(),performClick()和performLongClick(): 4.      TextView类中的append方法,追加文本: 5.      Decim

Android开发中的menu菜单

复写onCreateOptionsMenu方法,当点击menu菜单时,调用该方法. @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. //getMenuInflater().inflate(R.menu.main, menu); //第一个参数是组的ID,第二个参数是添加的选项的ID,第

vue仿美团侧边菜单组件

 这样一个组件的话我们是经常都能看到的,也经常都会用到,日常积累 首先从我们的布局开始,布局当然是越简单越好.我们是可以看到左边一个列表,固定不变的,右边是一个弹出菜单,菜单根据左边的每一栏获得不同的值,展示不同的内容,当然我这个gif图做得比较垃圾.大概明白这个意思就好 那么我看看这个布局怎么做 <template> <div class="m-menu"> <dl class="nav" @mouseleave='mouseleav

Android开发仿微信下拉关闭图片11

图片会跟随手指移动,只有是下滑时才会退出查看页面,其他情况会复位,直接当做ImageView使用即可,setViewCall方法是在下滑完成后要执行的操作,上,左,右,可自行扩展 onTouchEvent 监听手指坐标,GestureDetector 监听滑动的惯性,ViewHelper设置图片位移动画 public class FriendCircleView extends android.support.v7.widget.AppCompatImageView implements Ges