仿饿了么搜索框

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

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

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;

// 存放标签

ListmHistoryList = new ArrayList<>();

ListmHotList = new ArrayList<>();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_popup);

mSearch = findViewById(R.id.search_btn);

mSearch.setOnClickListener(this);

}

@Override

public 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的各个View

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

// 设置标签数据Adapter

String[] 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);

}

@Override

public void onItemClick(String itemStr) {

// 点击标签,将对应的String填入EditText

mEditQuery.setText(itemStr);

mEditQuery.setSelection(mEditQuery.getText().length());

}

}

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

public class SearchTagAdapter extends RecyclerView.Adapter{

private ListmTagList;

public SearchTagAdapter(ListtagList) {

this.mTagList = tagList;

}

OnItemClickListener mOnItemClickListener;

public interface OnItemClickListener{

void onItemClick(String itemStr);

}

@NonNull

@Override

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

}

@Override

public void onBindViewHolder(@NonNull CustomViewHolder customViewHolder, int positon) {

customViewHolder.tagText.setText(mTagList.get(positon));

}

@Override

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

}

@Override

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

}

@Override

public void getItemOffsets(Rect outRect, View view,

RecyclerView parent, RecyclerView.State state) {

outRect.right = space;

}

}

popupWindow布局:

搜索标签布局

search_bg.xml

tag_bg.xml

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

https://github.com/jayjunLiao/SearchPopupWindow

android仿饿了么筛选,Android仿饿了么搜索功能相关推荐

  1. Android 使用RecyclerView实现(仿微信)的联系人A-Z字母排序和过滤搜索功能

    之前做项目的时候遇到一个需求是实现品牌的字母排序功能,网上的资料很多,但是有一部分有bug,这篇文章是我学习和解决部分bug之后的总结.今天带来的是RecyclerView的A-Z字母排序和过滤搜索功 ...

  2. Android 仿2016版京东筛选

    之前传了github,忘了更新,给大家带来的不便请谅解! https://github.com/SimbaLiu/filter.github.io 京东筛选更新了,很好,很炫酷.那什么,我们也不差是吧 ...

  3. Android仿饿了么搜索功能

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

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

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

  5. Android自定义控件开发系列(三)——仿支付宝六位支付密码输入页面

    在移动互联领域,有那么几家龙头一直是我等学习和追求的目标,比如支付宝.微信.饿了么.酷狗音乐等等,大神举不胜举,他们设计的界面.交互方式已经培养了中国(有可能会是世界)民众的操作习惯:举个小例子,对话 ...

  6. android中仿qq最新版抽屉,Android实现3种侧滑效果(仿qq侧滑、抽屉侧滑、普通侧滑)...

    自己实现了一下侧滑的三种方式(注释都写代码里了) 本文Demo下载地址:Andriod侧滑 本文实现所需框架:nineoldandroids下载地址:nineoldandroids 1.普通侧滑: 主 ...

  7. android仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...

    Android实现简单底部导航栏 Android仿微信滑动切换效果 发布时间:2020-10-09 19:48:00 来源:脚本之家 阅读:96 作者:丶白泽 Android仿微信滑动切换最终实现效果 ...

  8. 【Android视图效果】共享元素实现仿微信查看大图效果

    在之前的文章中,我们通过动画实现了这个,具体可以查看[Android 动画]动画详解之仿微信查看大图效果(四),这里,我们用过度动画来实现. 什么是共享元素? 它是Android 5.0新加入的一种过 ...

  9. Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View...

    Android特效专辑(十二)--仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View 先来看看这个效果 这是我的在Only上添加的效果,说实话,Only现在都还只是半成品,台面都上不了,怪自己技术 ...

最新文章

  1. 鸿蒙之后华为把欧拉也捐了,还承诺不做欧拉商用发行版
  2. Android 使用OpenCV的三种方式(Android Studio)
  3. ajax和Java session监听
  4. 【转帖】配置管理计划(CM Plan)
  5. Linux平台上SQLite数据库教程(一)——终端使用篇
  6. mysql 临时表 限制_Mysql临时表
  7. jQuery省市联动
  8. 使用c++为node.js扩展模块
  9. 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(七)
  10. 关键字--static
  11. 十次方项目开发系列【3】:基于MyBatis Plus实现条件查询和分页
  12. 运放失调电压和开环增益,PSRR,CMRR的关系
  13. vue项目将localhost改成自己的ip访问
  14. 全息投影是计算机技术吗,3D全息投影技术怎么应用在展厅的?
  15. 【机器学习】(十)核支持向量机SVM:make_blobs方法,hstack() 函数
  16. 诸葛亮舌战群儒的技术分析总结
  17. Calendar 获得当前日期是这一年的第几天
  18. win7上安装microsoft edge浏览器, 模拟ie11模式
  19. 一款基于Flutter开发的语雀APP
  20. Advanced Installer多语言包安装

热门文章

  1. 【个人笔记】OpenCV4 C++ 图像处理与视频分析 04课
  2. python any all
  3. Git 小问题:fatal: not a git repository (or any of the parent directories): .git
  4. npm i 命令长时间卡住的解决办法
  5. 从前端到后台,开发一个完整功能的小程序
  6. Mac上搭建Go语言环境及第一个hello.go程序
  7. resiprocate之message
  8. python图像转字符画_Python3:图片转字符画
  9. linux学习笔记:我的第一个shell脚本
  10. 以下不属于计算机综合处理多媒体信息的有,国家开放大学《多媒体应用技术基础》第一-二次形成性考核任务试题...