转载请注明出处王亟亟的大牛之路

美团和大众点评的搜索和筛选栏,不能说好看(审美flag),但是满足了我们的搜索还筛选的需求,所以今天就实现了下这样的一个小Demo

项目结构:运行效果就是下图了,就不再截图了

初始化的样子:

具体实现就是起初3个LinearLayout,点击之后出现一个ListView然后会根据对这个LisvView的点击可能会再出现下一级别的子菜单。

废话不多说,直接上代码
MainActivity

public class MainActivity extends Activity implements OnClickListener,
OnDismissListener{private ImageView icon1, icon2, icon3;private TextView fenlei, diqu, paixu;private LinearLayout ll_top;private LinearLayout ll_fenlei, ll_diqu, ll_paixu;private ListView lv1, lv2,lv3, lv4;private LinearLayout ll2;private PopupWindow popLeft,popMid,popRight;private List<father> fatlist;private List<son> sonlist,sonlist1,sonlist2,sonlist3,sonlist4;private List<son> right;private int screenWidth;private int screenHeight;private MyAdapterLeft adapterleft;private MyAdapterSon adapterleftson;private MyAdapterRight adapterRight;private int imaPosition;//选中的@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initScreenWidth();intifatherlist();   intiView();}private void intiView() {ll_top =(LinearLayout) findViewById(R.id.ll_layout);ll_fenlei = (LinearLayout) findViewById(R.id.ll_quyu);ll_diqu = (LinearLayout) findViewById(R.id.ll_jiage);ll_paixu = (LinearLayout) findViewById(R.id.ll_huxing);fenlei = (TextView) findViewById(R.id.fenlei);diqu  = (TextView) findViewById(R.id.diqu);paixu = (TextView) findViewById(R.id.paixu);icon1 = (ImageView) findViewById(R.id.icon1);icon2 = (ImageView) findViewById(R.id.icon2);icon3 = (ImageView) findViewById(R.id.icon3);ll_fenlei.setOnClickListener(this);ll_diqu.setOnClickListener(this);ll_paixu.setOnClickListener(this);  getPopLeft();getPopRight();}/**初始化父类和子类*/private void intifatherlist() {fatlist = new ArrayList<father>();sonlist = new ArrayList<son>();sonlist1 = new ArrayList<son>();sonlist2 = new ArrayList<son>();sonlist3 = new ArrayList<son>();sonlist4 = new ArrayList<son>();for (int i = 0; i < 5; i++) {son s = new son();s.setId(i+"");s.setName("子菜单"+i);sonlist.add(s);}for (int i = 0; i < 15; i++) {son s = new son();s.setId(i+"");s.setName("子菜单"+i);sonlist1.add(s);}for (int i = 0; i < 5; i++) {son s = new son();s.setId(i+"");s.setName("子菜单"+i);sonlist2.add(s);}for (int i = 0; i < 6; i++) {son s = new son();s.setId(i+"");s.setName("子菜单"+i);sonlist3.add(s);}for (int i = 0; i < 13; i++) {son s = new son();s.setId(i+"");s.setName("子菜单"+i);sonlist4.add(s);}/**初始化父类*/for (int i = 0; i < 5; i++) {father father = new father();father.setId(i+"");father.setName("主菜单"+i);if (i==0) {father.setImage(R.drawable.ic_category_all);father.setSonList(null);}if (i==1) {father.setImage(R.drawable.ic_category_entertainment);father.setSonList(sonlist1);}if (i==2) {father.setImage(R.drawable.ic_category_food);father.setSonList(sonlist2);}if (i==3) {father.setImage(R.drawable.ic_category_health); father.setSonList(sonlist3);}if (i==4) {father.setImage(R.drawable.ic_category_hot);father.setSonList(sonlist4);}fatlist.add(father);}}/*** @Title: initScreenWidth* @Description: 查看自身的宽高* @author yimei* @return void 返回类型*/private void initScreenWidth() {DisplayMetrics dm = new DisplayMetrics();dm = getResources().getDisplayMetrics();screenHeight = dm.heightPixels;screenWidth = dm.widthPixels;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.ll_quyu:getPopLeft();popLeft.showAsDropDown(ll_top);break;case R.id.ll_jiage:break;case R.id.ll_huxing:getPopRight();popRight.showAsDropDown(ll_top);break;}}@Overridepublic void onDismiss() {}/***获取PopupWindow实例 .分类*/ private void getPopLeft() { if (null != popLeft) { popLeft.dismiss(); return ; } else {//初始化分类弹窗initPopLeft();}
} /***获取PopupWindow实例 .分类*/ private void getPopRight() { if (null != popRight) { popRight.dismiss(); return ; } else {//初始化分类弹窗initPopRight();}
} /** * 创建分类弹出PopupWindow */ protected void initPopLeft() { // 获取自定义布局文件pop.xml的视图 View left_view = getLayoutInflater().inflate(R.layout.popleft, null, false); left_view.setFocusable(true); // 这个很重要left_view.setFocusableInTouchMode(true);// PopupWindow(布局,宽度,高度)popLeft = new PopupWindow(left_view,screenWidth, screenHeight, true);popLeft.setFocusable(true);// 重写onKeyListener,按返回键消失left_view.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {popLeft.dismiss();//为空的话就会重新构建不会保留
//              popLeft = null;return true;}return false;}});// 设置动画效果
//  popupWindow.setAnimationStyle(R.style.AnimationFade); //点击其他地方消失 left_view.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (popLeft != null && popLeft.isShowing()) { popLeft.dismiss(); } return false; }}); // pop.xml视图里面的控件 lv1 = (ListView) left_view.findViewById(R.id.lv1); lv2 = (ListView) left_view.findViewById(R.id.lv2); ll2 = (LinearLayout) left_view.findViewById(R.id.ll2);adapterleft = new MyAdapterLeft(MainActivity.this, fatlist);lv1.setAdapter(adapterleft);//listview的监听lv1.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) {adapterleft.setSelectItem(position);imaPosition = position;adapterleft.notifyDataSetChanged();adapterleftson =new MyAdapterSon(MainActivity.this,fatlist.get(position).getSonList());lv2.setAdapter(adapterleftson);     //二维数组里面有元素if (fatlist.get(position).getSonList()!=null) {//不为空才显示lv2.setVisibility(View.VISIBLE);lv2.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent,View view, int position, long id) {//变色效果adapterleftson.setSelectItem(position);String name =adapterleftson.getItem(position).getName();setHeadText(1, name,fatlist.get(imaPosition).getImage());popLeft.dismiss();}});//没元素   } else {// 当没有下级时直接将信息设置textview中String name = fatlist.get(position).getName();int img = fatlist.get(position).getImage();//第一个都是1setHeadText(1, name,img);popLeft.dismiss();}}});}/**最右边的弹窗,排序*/protected void initPopRight() { // 获取自定义布局文件pop.xml的视图 View left_right = getLayoutInflater().inflate(R.layout.popright, null, false); left_right.setFocusable(true); // 这个很重要left_right.setFocusableInTouchMode(true);// PopupWindow(布局,宽度,高度)popRight = new PopupWindow(left_right,screenWidth, screenHeight, true);popRight.setFocusable(true);// 重写onKeyListener,按返回键消失left_right.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {popRight.dismiss();//为空的话就会重新构建不会保留
//                  popLeft = null;return true;}return false;}});// 设置动画效果
//      popupWindow.setAnimationStyle(R.style.AnimationFade); //点击其他地方消失 left_right.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (popRight != null && popRight.isShowing()) { popRight.dismiss(); } return false; }}); // pop.xml视图里面的控件 lv3 = (ListView) left_right.findViewById(R.id.lv3); right = new ArrayList<son>();for (int i = 0; i < 4; i++) {son s = new son();s.setId(i+"");if (i==0) {s.setName("智能排序");}if (i==1) {s.setName("好评优先");}if (i==2) {s.setName("离我最近");}if (i==3) {s.setName("人均最低");}right.add(s);}adapterRight = new MyAdapterRight(MainActivity.this, right);lv3.setAdapter(adapterRight);lv3.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) {adapterRight.setSelectItem(position);// 当没有下级时直接将信息设置textview中String name = right.get(position).getName();setHeadText(3, name,0);popRight.dismiss();}});}/*** @Title: setHeadText* @Description: 点击之后设置在上边的TextView里* @author yimei* @return void 返回类型*/private void setHeadText(int idx, String text,int image) {switch (idx) {case 1:fenlei.setText(text);icon1.setImageResource(image);break;case 2:diqu.setText(text);break;case 3:paixu.setText(text);break;}}   }

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FFFFFF"tools:context=".MainActivity" ><LinearLayout
        android:id="@+id/ll_layout"android:layout_width="match_parent"android:layout_height="40dip"android:background="#FFFFFF"android:orientation="horizontal" ><LinearLayout
            android:id="@+id/ll_quyu"android:layout_width="0dip"android:layout_height="40dip"android:layout_weight="1"android:gravity="center_vertical|center_horizontal"android:orientation="horizontal"android:paddingLeft="10dip" ><ImageView
                android:id="@+id/icon1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/documents" /><TextView
                android:id="@+id/fenlei"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:text="@string/quyu"android:textColor="#4d4d4d" /></LinearLayout><View
            android:layout_width="1dip"android:layout_height="20dip"android:layout_gravity="center_vertical"android:background="#e6e6e6" /><LinearLayout
            android:id="@+id/ll_jiage"android:layout_width="0dip"android:layout_height="40dip"android:layout_weight="1"android:gravity="center_vertical|center_horizontal"android:orientation="horizontal"android:paddingLeft="10dip" ><ImageView
                android:id="@+id/icon2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/location_pin" /><TextView
                android:id="@+id/diqu"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:text="@string/jiage"android:textColor="#4d4d4d" /></LinearLayout><View
            android:layout_width="1dip"android:layout_height="20dip"android:layout_gravity="center_vertical"android:background="#e6e6e6" /><LinearLayout
            android:id="@+id/ll_huxing"android:layout_width="0dip"android:layout_height="40dip"android:layout_weight="1"android:gravity="center_vertical|center_horizontal"android:orientation="horizontal"android:paddingLeft="10dip" ><ImageView
                android:id="@+id/icon3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/resize_100" /><TextView
                android:id="@+id/paixu"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:text="@string/huxing"android:textColor="#4d4d4d" /></LinearLayout></LinearLayout><View
        android:layout_width="match_parent"android:layout_height="1dip"android:layout_below="@id/ll_layout"android:background="#e6e6e6" /></RelativeLayout>

参数的适配器(就贴一个了,这部分没什么,看源码更清楚)

public class MyAdapterLeft extends BaseAdapter {private List<father> l;private Context context;private int selectItem = -1;public MyAdapterLeft(Context context, List<father> l) {this.context = context;this.l = l;}@Overridepublic int getCount() {return l.size();}@Overridepublic Object getItem(int position) {return l.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Holder holder = null;if (convertView == null) {holder = new Holder();convertView = LayoutInflater.from(context).inflate(R.layout.item,null);holder.name = (TextView) convertView.findViewById(R.id.name);holder.img = (ImageView) convertView.findViewById(R.id.img);convertView.setTag(holder);} else {holder = (Holder) convertView.getTag();}holder.name.setText(l.get(position).getName());holder.img.setImageResource(l.get(position).getImage());if (position == selectItem) {convertView.setBackgroundColor(context.getResources().getColor(R.color.click));holder.name.setTextColor(Color.BLUE);} else {convertView.setBackgroundColor(context.getResources().getColor(R.color.defult));holder.name.setTextColor(Color.BLACK);}return convertView;}public void setSelectItem(int selectItem) {this.selectItem = selectItem;}class Holder {TextView name;ImageView img;}private void show(String str) {Toast.makeText(context, str, 0).show();}
}

一些比较重要的内容就这些了,子层级的item啊,father son的对象声明啊,看源码吧,只是用于填充数据的容器而已
源码:http://yunpan.cn/cmwJbWZ3FdpdZ 访问密码 493b

部分内容参考互联网,如有重复请见谅

android 粗暴简单仿美团/大众点评搜索方式,详细标注相关推荐

  1. 美团技术团队-大众点评搜索基于知识图谱的深度学习排序实践

    美团技术团队博客网址:https://tech.meituan.com/2019/02/28/root-clause-analysis.html 1. 引言 挑战与思路 搜索是大众点评App上用户进行 ...

  2. 【实践】端智能在大众点评搜索推荐重排序的应用实践

    猜你喜欢 0.2022年人才市场洞察及薪酬指南1.如何搭建一套个性化推荐系统?2.[免费下载]2022年1月份热门报告3.全民K歌推荐系统算法.架构及后台实现4.微博推荐算法实践与机器学习平台演进5. ...

  3. 大众点评搜索相关性技术探索与实践

    搜索相关性用于衡量Query和Doc的相关程度,是搜索引擎的重要环节,本文主要讲述大众点评搜索团队在相关性计算上的技术探索和实践,通过多相似矩阵模型结构.多阶段训练等方法提升预训练模型在相关性问题上的 ...

  4. 端智能在大众点评搜索重排序的应用实践

    端智能,是指在移动端设备运行人工智能(AI)应用的技术.本文主要讲述大众点评搜索场景下,在端侧部署大规模深度学习模型进行搜索重排序任务的实践方案,包括端上特征工程.模型迭代思路,以及具体部署优化的过程 ...

  5. 领域应用 | 大众点评搜索基于知识图谱的深度学习排序实践

    本文转载自公众号:美团技术团队. 本文介绍了大众点评搜索核心排序层模型的演化之路,包括结合知识图谱信息构建适合搜索场景的Listwise深度学习排序模型LambdaDNN以及特征工程实践和相关工具建设 ...

  6. GitChat · 测试 | 大众点评搜索测试全揭露:1:9 的测试开发比下 QA 如何前行

    GitChat 作者:梦婷 原文:大众点评搜索测试全揭露:1:9 的测试开发比下 QA 如何前行 关注微信公众号:GitChat 技术杂谈 ,一本正经的讲技术 [不要错过文末活动] 背景介绍 本人20 ...

  7. 王兴的“下半场”与美团-大众点评的另一种可能

    O2O市场,棋至中局,业内企业有的式微沉沦,有的关停售卖,也有巨头合并抑或战略结盟.抱团取火,旨在冲出重围,僵局之下,不破不立. 于王兴与他的美团-大众点评而言,也是如此,不破不立.经历了3个季度,美 ...

  8. 美团大众点评 Hybrid 化建设

    上周末,精神哥去参加了好友小青在北京办的T沙龙,探讨移动端热更新相关的话题.Bugly曾为大家介绍过不少腾讯内部的热更新的框架,正好这次看到了美团,去哪儿以及微博同学在应用热更新方面的实践,整理出来发 ...

  9. 深度学习核心技术精讲100篇(三十一)-大众点评搜索基于知识图谱的深度学习排序实践

    1. 引言 挑战与思路 搜索是大众点评App上用户进行信息查找的最大入口,是连接用户和信息的重要纽带.而用户搜索的方式和场景非常多样,并且由于对接业务种类多,流量差异大,为大众点评搜索(下文简称点评搜 ...

最新文章

  1. linux c实现函数回调,c语言实现linux抓包
  2. pytorch使用mean降维打击
  3. 04.ARP:地址解析协议
  4. HighNewTech:2021阿里云开发者大会-大咖来了(更新中)
  5. 三百元月薪的小资生活
  6. WebRTC拥塞控制算法——GCC介绍
  7. SpringBoot 整合Shiro Ehcache
  8. HTTP method POST is not supported by this URL解决方案
  9. 28款超级绿色版杀软,奉献给各位!【迅雷下载】
  10. mysql 删除表的方法_MySQL 删除表的三种方式
  11. 尚观python培训视频教程
  12. 利用百度智能云-文字识别 auto.js
  13. Dynamics CRM 365零基础入门学习(五)权限管理
  14. 屏幕快照之旅:Android 4.2 Jelly Bean的10个新功能
  15. Cisco SN查询工具
  16. origin出图重合部分变色了,怎么办?
  17. arduino超声波测距接线图详细_Arduino系列之超声波测距模块代码(一)
  18. 国家电网王继业:企业数字化发展的“3-3-4”框架
  19. 第4章-5 求e的近似值 (15分)python
  20. RabbitMQ如何防止消息丢失及重复消费

热门文章

  1. 仿起点中文网的小说网站——JavaEE大作业
  2. 【手机投影】安卓手机投影到WIN10
  3. Orleans学习入门(最近公司要用奥尔良,特此记录下学习过程,希望各大神多指教)...
  4. CCF CSP 201803-4 棋局评估
  5. Python快速查找每个站的最近的10个站
  6. 故障分析 | 从 data_free 异常说起
  7. 关闭占用端口号的程序
  8. DL之RNN:人工智能为你写周董歌词——基于TF利用RNN算法实现【机器为你作词】、训练测试过程全记录
  9. mysql compact_MySQL基本操作
  10. LightGBM源码阅读+理论分析(处理特征类别,缺省值的实现细节)