仿饿了么搜索框

这里采用的是pupupWindow来实现,一个全屏的popupWindow里面放各个View做对应操作

首先是activity_popup.xml布局,很简单,就一个带背景的TextView,点击弹出popupWindow,这里都用的ConstraintLayout布局,以减少View的层数,对ConstraintLayout不了解可以无视(界面使用什么ViewGeoup搭建都一样,主要是代码逻辑)

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="20dp"tools:context=".PopupActivity"><TextViewandroid:id="@+id/search_btn"android:gravity="center"android:paddingBottom="5dp"android:paddingTop="5dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"android:background="@drawable/search_bg"android:text="搜索"android:layout_width="0dp"android:layout_height="wrap_content"tools:ignore="MissingConstraints" />
</android.support.constraint.ConstraintLayout>

PopupActivity代码:

public class PopupActivity extends AppCompatActivity implements View.OnClickListener, SearchTagAdapter.OnItemClickListener {private PopupWindow mPopupWindow;private View mPopView;private TextView mSearch;private SearchTagAdapter mHistoryAdapter;private SearchTagAdapter mHotAdapter;private RecyclerView mHistoryRecycler;private RecyclerView mHotRecycler;private View mHistoryHeader;private View mHotHeader;private EditText mEditQuery;// 存放标签List<String> mHistoryList = new ArrayList<>();List<String> mHotList = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_popup);mSearch = findViewById(R.id.search_btn);mSearch.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.search_btn:createPopupWindow();break;case R.id.search:// 获取EditText内容,进行相应操作Editable editQueryable = mEditQuery.getText();String editQueryText = "";if (editQueryable != null) {editQueryText = editQueryable.toString();}mEditQuery.setText("");mPopupWindow.dismiss();Toast.makeText(this, editQueryText, Toast.LENGTH_SHORT).show();break;case R.id.back:mPopupWindow.dismiss();break;case R.id.clear_history:// 清空搜索历史,隐藏'历史搜索'头部局mHistoryList.clear();mHistoryAdapter.notifyDataChanged();setHeaderVisibility(View.GONE);break;}}private void createPopupWindow() {// 获取屏幕宽高,用于设置popupWindow大小Resources resources = this.getResources();DisplayMetrics dm = resources.getDisplayMetrics();int width = dm.widthPixels;int height = dm.heightPixels;// 初始化pupupWindow的各个ViewView pupView = LayoutInflater.from(this).inflate(R.layout.item_search_pop, null);ImageView back = pupView.findViewById(R.id.back);ImageView clearHistory = pupView.findViewById(R.id.clear_history);TextView search = pupView.findViewById(R.id.search);mHistoryHeader = pupView.findViewById(R.id.history);mHotHeader = pupView.findViewById(R.id.hot);mEditQuery = pupView.findViewById(R.id.edit_query);mHistoryRecycler = pupView.findViewById(R.id.history_content);mHotRecycler = pupView.findViewById(R.id.hot_content);// 流式布局设置flexboxConfig(mHistoryRecycler);flexboxConfig(mHotRecycler);// 设置标签数据AdapterString[] tags = {"披萨", "火锅", "海底捞", "芝士蛋糕", "大闸蟹", "黄焖鸡米饭", "沙县小吃"};mHistoryList.clear();mHotList.clear();mHistoryList.addAll(Arrays.asList(tags));mHotList.addAll(Arrays.asList(tags));mHistoryAdapter = new SearchTagAdapter(mHistoryList);mHotAdapter = new SearchTagAdapter(mHotList);mHistoryRecycler.setAdapter(mHistoryAdapter);mHotRecycler.setAdapter(mHotAdapter);/*** 初始化PopupWindow进行各项设置*/mPopupWindow = new PopupWindow(pupView, width, height);mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#FFFFFF")));// 设置可以获取焦点mPopupWindow.setFocusable(true);// 设置可以触摸弹出框以外的区域mPopupWindow.setOutsideTouchable(true);// 更新popupwindow的状态mPopupWindow.update();mPopupWindow.showAtLocation(getWindow().getDecorView(), Gravity.CENTER, 0,0);mHistoryAdapter.setOnItemClickListener(this);mHotAdapter.setOnItemClickListener(this);back.setOnClickListener(this);search.setOnClickListener(this);clearHistory.setOnClickListener(this);}/*** 隐藏历史搜索头部* @param visibility*/private void setHeaderVisibility(int visibility) {mHistoryHeader.setVisibility(visibility);mHistoryRecycler.setVisibility(visibility);}/*** 流式布局设置* @param recyclerView*/private void flexboxConfig(RecyclerView recyclerView){FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(this);layoutManager.setFlexWrap(FlexWrap.WRAP);layoutManager.setFlexDirection(FlexDirection.ROW);layoutManager.setAlignItems(AlignItems.STRETCH);layoutManager.setJustifyContent(JustifyContent.FLEX_START);// 设置item间隔recyclerView.addItemDecoration(new RecyclerViewItemDecoration(30));recyclerView.setLayoutManager(layoutManager);}@Overridepublic void onItemClick(String itemStr) {// 点击标签,将对应的String填入EditTextmEditQuery.setText(itemStr);mEditQuery.setSelection(mEditQuery.getText().length());}
}

SearchTagAdapter: 历史搜索/热门搜索标签Adapter,和正常的RecyclerView Adapter没有区别,就是多写一个item监听

public class SearchTagAdapter extends RecyclerView.Adapter<SearchTagAdapter.CustomViewHolder> {private List<String> mTagList;public SearchTagAdapter(List<String> tagList) {this.mTagList = tagList;}OnItemClickListener mOnItemClickListener;public interface OnItemClickListener{void onItemClick(String itemStr);}@NonNull@Overridepublic SearchTagAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_tag, viewGroup, false);return new CustomViewHolder(view, mOnItemClickListener);}@Overridepublic void onBindViewHolder(@NonNull CustomViewHolder customViewHolder, int positon) {customViewHolder.tagText.setText(mTagList.get(positon));}@Overridepublic int getItemCount() {return mTagList == null ? 0 : mTagList.size();}// RecyclerView没有item点击监听功能,需要自己写public void setOnItemClickListener(OnItemClickListener onItemClickListener) {this.mOnItemClickListener = onItemClickListener;}public void notifyDataChanged() {notifyItemChanged(getItemCount());}static class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {TextView tagText;OnItemClickListener mItemClickListener;public CustomViewHolder(@NonNull View itemView, OnItemClickListener onItemClickListener) {super(itemView);tagText = itemView.findViewById(R.id.tag_text);tagText.setOnClickListener(this);this.mItemClickListener = onItemClickListener;}@Overridepublic void onClick(View v) {if (mItemClickListener != null && v instanceof TextView) {mItemClickListener.onItemClick(((TextView)v).getText().toString());}}}
}

RecyclerViewItemDecoration用于设置RecyclerView item间距

public class RecyclerViewItemDecoration extends RecyclerView.ItemDecoration {private int space;public RecyclerViewItemDecoration(int space) {this.space = space;}@Overridepublic void getItemOffsets(Rect outRect, View view,RecyclerView parent, RecyclerView.State state) {outRect.right = space;}
}

popupWindow布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"><ImageViewandroid:id="@+id/back"android:src="@drawable/icon_back"app:layout_constraintTop_toTopOf="@id/edit_query"app:layout_constraintBottom_toBottomOf="@id/edit_query"app:layout_constraintLeft_toLeftOf="parent"android:layout_width="20dp"android:layout_height="30dp"tools:ignore="MissingConstraints" /><TextViewandroid:id="@+id/search"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="@id/edit_query"app:layout_constraintBottom_toBottomOf="@id/edit_query"android:text="搜索"android:textSize="18sp"android:textColor="#000000"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:ignore="MissingConstraints" /><EditTextandroid:id="@+id/edit_query"android:background="@drawable/search_bg"app:layout_constraintLeft_toRightOf="@id/back"app:layout_constraintRight_toLeftOf="@id/search"android:padding="10dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:hint="输入搜索内容"android:layout_width="0dp"android:layout_height="wrap_content"tools:ignore="MissingConstraints" /><RelativeLayoutandroid:id="@+id/history"app:layout_constraintTop_toBottomOf="@id/edit_query"android:layout_width="match_parent"android:layout_height="wrap_content"tools:ignore="MissingConstraints"><TextViewandroid:layout_marginTop="20dp"android:textColor="#000000"android:textSize="15dp"android:text="历史搜索"android:layout_centerVertical="true"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:ignore="MissingConstraints" /><ImageViewandroid:id="@+id/clear_history"android:layout_centerVertical="true"android:layout_alignParentRight="true"app:layout_constraintRight_toRightOf="parent"android:src="@drawable/icon_clear"android:layout_width="20dp"android:layout_height="40dp"tools:ignore="MissingConstraints" /></RelativeLayout><android.support.v7.widget.RecyclerViewandroid:id="@+id/history_content"app:layout_constraintTop_toBottomOf="@id/history"android:layout_marginTop="10dp"android:layout_width="match_parent"android:layout_height="wrap_content"tools:ignore="MissingConstraints"/><TextViewandroid:id="@+id/hot"app:layout_constraintTop_toBottomOf="@id/history_content"android:layout_marginTop="20dp"android:textColor="#000000"android:textSize="15dp"android:text="热门搜索"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:ignore="MissingConstraints" /><android.support.v7.widget.RecyclerViewandroid:id="@+id/hot_content"app:layout_constraintTop_toBottomOf="@id/hot"android:layout_marginTop="10dp"android:layout_width="match_parent"android:layout_height="wrap_content"tools:ignore="MissingConstraints"/>
</android.support.constraint.ConstraintLayout>

搜索标签布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_marginBottom="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"><TextViewandroid:id="@+id/tag_text"android:textSize="15sp"android:paddingTop="5dp"android:paddingBottom="5dp"android:paddingLeft="10dp"android:paddingRight="10dp"android:textColor="#565656"android:lines="1"android:maxEms="9"android:ellipsize="end"android:background="@drawable/tag_bg"android:gravity="center"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:ignore="MissingConstraints" />
</android.support.constraint.ConstraintLayout>

search_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="20dp" /><solid android:color="#F1F1F1"/>
</shape>

tag_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#F7F7F7"/><corners android:radius="5dp" />
</shape>

搜索界面的基本功能差不多实现了,接下来使用可以根据需要自己封装或者添加其它功能,我进行了一个简单的功能封装,可以直接拿来使用
https://github.com/jayjunLiao/SearchPopupWindow

Android仿饿了么搜索功能相关推荐

  1. android仿饿了么筛选,Android仿饿了么搜索功能

    仿饿了么搜索框 这里采用的是pupupWindow来实现,一个全屏的popupWindow里面放各个View做对应操作 首先是activity_popup.xml布局,很简单,就一个带背景的TextV ...

  2. Android仿淘宝历史搜索功能,使用localStorage实现历史记录搜索功能也便是天猫app历史记录存储方便浏览...

    使用localStorage实现历史记录搜索功能也就是天猫app历史记录存储方便浏览 得益于H5的API,前端可以很方便的存储数据,除了cookie,新增的sessionStorage.localSt ...

  3. android仿淘宝语音搜索功能集成科大讯飞

    样式: 1.集成科大讯飞:网上有很多集成方法. 2.写布局,注意帧布局有顺序谁在最上面,要在布局文件下面写.下面是我的布局,注意用Scrollview套,是因为要随键盘上下滑动. <Relati ...

  4. android右滑返回动画,Android仿微信右滑返回功能的实例代码

    先上效果图,如下: 先分析一下功能的主要技术点,右滑即手势判断,当滑到一直距离时才执行返回,并且手指按下的位置是在屏幕的最左边(这个也是有一定范围的),  这些可以实现onTouchEvent来实现. ...

  5. android人脸识显示头像自定义,Android 仿QQ头像自定义截取功能

    看了Android版QQ的自定义头像功能,决定自己实现,随便熟悉下android绘制和图片处理这一块的知识. 先看看效果: 思路分析: 这个效果可以用两个View来完成,上层View是一个遮盖物,绘制 ...

  6. Android仿微信小视频录制功能(二)

    Android仿微信小视频录制功能(二) 接着上一篇,在完成了录制功能后,伟大的哲学家沃兹基索德曾经说过:"有录就有放.",那么紧接着就来实现播放功能,按照国际惯例,先上下效果图: ...

  7. Android仿饿了么加减控件,Flutter + Native混合栈仿饿了么APP

    前言 一个基于Flutter + Native混合开发的APP,请求数据均人为制造. 目前仅上传Android版本,iOS暂未上传 APK下载 Github地址 效果图: 实现功能: 首页 使用百度定 ...

  8. android 高德地图之poi搜索功能的实现

    二话不多说,先看效果 这个功能我是用Fragmentdialog里面做的,也遇到不少坑 第一,就是设置背景的drawable为纯白色导致键盘弹出的时候,recyclerview的布局被顶上去导致出现白 ...

  9. android饿了么购物车,Android仿饿了么加入购物车旋转控件自带闪转腾挪动画的按钮效果(实例详解)...

    概述 在上文,酷炫Path动画已经预告了,今天给大家带来的是利用 纯自定义View,实现的仿饿了么加入购物车控件,自带闪转腾挪动画的按钮. 效果图如下: 图1 项目中使用的效果,考虑到了View的回收 ...

最新文章

  1. 为什么很难训练深度神经网络?
  2. JSR 365更新:深入CDI 2.0
  3. uva 11178(几何)
  4. 表贴电阻尺寸与什么有关_什么是LED点光源屏?常见的LED点光源规格和型号
  5. USB VIDPID 表
  6. 机器学习选择 Python 还是 R 语言?要不直接用 SQL 吧!
  7. 高德地图登陆显示服务器忙,用高德地图导航时,登录账号和不登录账号有很大区别?你知道吗?...
  8. 微计算机cpu是指什么,微处理器和CPU的不同是什么
  9. 第八章笔记[计算机网络]
  10. java 日程日历_java编程:我要做一个提醒日程的软件,不是要用到日历和时钟么,这要不要自己编,还是可以直接同步电脑上...
  11. Windows 命令行基础
  12. Windows10专业版系统“本地组策略编辑器”丢失解决方案
  13. 土豆的31种做法,别告诉我你只知道酸辣土豆丝----小V美味馆
  14. Java小游戏实操---大鱼吃小鱼 游戏开发
  15. win10 企业版 设备管理器找不到 端口(COM和LPT)
  16. 数据库--聚集函数及其应用
  17. seo伪原创文章优化(怎么找可以做伪原创的文章)
  18. DaoCloud道客:云原生多云应用利器–Karmada总览篇
  19. Python tkinter库:简易画板(笔、直线、矩形、圆形和橡皮擦工具+导入、保存、撤销、清屏功能)
  20. maven父子关系时,发生异常: Could not find artifact org.hlx.itrip:itrip-dao:jar:1.0-SNAPSHOT - [Help 1]

热门文章

  1. android电视系统升级,如何对安卓电视机进行固件(软件)升级?
  2. c语言中能否将打开多个文件的行为放入循环中
  3. python设计模式名片_Python 设计模式 简单工厂(设计模式之禅)
  4. Linux例行工作与系统管理
  5. 谁说程序员不浪漫,那是你没有深入了解他们,云效上线“云中谁寄锦书来”云端专属密码情书
  6. openfire文件传输
  7. 前端入门之(vuex源码解析一)
  8. 如何成为出色的演讲家
  9. Galileo:一款开源Web应用审计框架
  10. PAT A级 1076 Forwards on Weibo (超详细BFS做法)