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

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

美团和大众点评的搜索和筛选栏,不能说好看(审美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;//选中的
    @Override
    protected 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;
    }

    @Override
    public 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;
        }
    }
    @Override
    public 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() {
        @Override
        public 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() {
    @Override
    public 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() {
                @Override
                public 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();
            //第一个都是1
            setHeadText(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() {
            @Override
            public 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() {

            @Override
            public 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;
    }

    @Override
    public int getCount() {
        return l.size();
    }

    @Override
    public Object getItem(int position) {
        return l.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public 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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-01 04:10:30

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

【腾讯Bugly干货分享】美团大众点评 Hybrid 化建设

本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/rNGD6SotKoO8frmxIU8-xw 本期 T 沙龙探讨了移动端热更新相关的话题.由于沙龙时间的限制,本期我们选取了美团的 Hybrid 化建设.去哪儿的跨平台 ListView 性能优化.微博 Android 端热更新踩过的坑话题.还期待热更新.热修复哪些话题?欢迎留言给我们.也欢迎报名参加 T 沙龙分享自己开发中的心得. Hybrid 是移动

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

最近在项目中需要用到下拉菜单,公司比较推崇美团的下拉菜单,于是要实现该功能,想着,这个功能应该是一个经常会用到的,于是何不写一个帮助类,只要往这个类里面传入特定的参数,既可以实现下来菜单,而且还可以实现菜单选择的回调,既可以重复使用,有简单便捷 首先,查看界面效果图 界面倒是比较简单,主要列下功能: 这个是靠一个帮助类实现的,下次想在自己的项目中实现该功能,一句引用代码,传入特定的参数既可以实现该功能 菜单弹出的时候,背景变灰色,菜单收回,背景回复白色 自动给选定的选项添加背景色,如果下次选择的

Android自定义控件:仿美团下拉菜单及相关代码优化

背景 最近的项目中用到了类似美团中的下拉多选菜单,在实际开发过程中,也发现了一些问题,主要归纳如下: 1.当菜单较为复杂时,如果不能设计好代码逻辑,将造成控件难于维护 2.美团菜单可以连续点击顶部tab,切换不同菜单,而我使用的popupWindow似乎在展开一个菜单时点击其他tab,菜单就会收回. 本文将针对如上两个问题进行一些讨论,最终给出较为合理的解决方案. 程序结构 由于菜单涉及多级多项,如果把UI和其他逻辑堆在一起写,必然会造成代码过于庞大,甚至没有办法扩展,更谈不上及时变更需求. V

Android应用之——仿美团loading加载中动画

前言 想必用过美团客户端的用户对美团那个加载小人的动画印象很深刻,一个可爱的小人在那拼命的跑.这个动画实现的方法其实很多,今天这里就用frame动画来实现一下. 一.效果图 二.布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_w

Android动画之仿美团加载数据等待时小人奔跑..

摘要:有人推崇产品,有人推崇运营,也有人推崇战略-到底该推崇什么?李智勇系统地分析了这三者之间的思路,并引用黑格尔的一句话,给出了自己的看法:在尺度中已经蕴含本质,这在产品.运营.战略的侧重上体现的非常好. 视野不拉升或者认知不深入时,就容易在盲人摸象层面上反复,看到微信火了,那就产品最重要,看到阿里火了,那就平台最重要.实际上一个比较显然的事实是,没有锥子一样的产品,那你就火不起来:不能从产品升级为平台,那就很可能活不下去.当然,有些人会说平台也是一种产品,但就和人与猴子都是灵长目,实际上仍是

美团大众点评服务框架Pigeon

服务框架Pigeon架构 ? Pigeon提供jar包接入 ,线上运行在tomcat里 ? Monitor-CAT ,负责调用链路分析.异常监控告警等 ? 配置中心-Lion ,负责一些开关配置读取 ? Governor-服务治理门户 ? 一个interface定义为一个服务 ,每个服务有一个唯一标识 服务的注册与发现 ? 注册信息包括service name.ip.port.group等 ? 服务提供方初始化完成后自动注册 ,也可以通过api或管理端注册 ? 服务调用方通过service na

怎么干翻大众点评

要挑战甚至干翻大众点评,先要知道大众点评的优势或者根基是什么? 第一.海量的商户信息. 第二.累积多年的UGC点评内容. 第三.已经形成的忠实用户与移动/线下渠道(包括各城市入驻的销售团队等). ------------------------------ <第一 海量的商户信息累积> --------------------------------- Dp起源于上海,经过近十年的数据累积.目前上海地区至少餐饮商户的覆盖率已经非常高了.但全国范围内看,点评的模式决定了它前进会比较缓慢.杭州地区

Android自定义控件之仿汽车之家下拉刷新

关于下拉刷新的实现原理我在上篇文章Android自定义控件之仿美团下拉刷新中已经详细介绍过了,这篇文章主要介绍表盘的动画实现原理 汽车之家的下拉刷新分为三个状态: 第一个状态为下拉刷新状态(pull to refresh),在这个状态下是一个表盘随着下拉的距离动态改变指针的角度 第二个状态为放开刷新状态(release to refresh),在这个状态下是指针角度变化的一个动画 第一个状态的实现: 这个效果我们使用自定义View来实现,我们从汽车之家apk中拿到下拉刷新所用到的两张图片: 我们

Android 仿美团网,大众点评购买框悬浮效果之修改版

我之前写了一篇关于美团网,大众点评的购买框效果的文章Android对ScrollView滚动监听,实现美团.大众点评的购买悬浮效果,我自己感觉效果并不是很好,如果快速滑动界面,显示悬浮框的时候会出现一卡的现象,有些朋友说有时候会出现两个布局的情况,特别是对ScrollView滚动的Y值得监听,我还使用了Handler来获取,还有朋友给我介绍了Scrolling Tricks这个东西,我下载试了下,确实美团网,大众点评的购买框用的是这种效果,但是Scrolling Tricks只能在API11以上