android仿饿了么筛选,Android仿饿了么搜索功能
仿饿了么搜索框
这里采用的是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仿饿了么搜索功能相关推荐
- Android 使用RecyclerView实现(仿微信)的联系人A-Z字母排序和过滤搜索功能
之前做项目的时候遇到一个需求是实现品牌的字母排序功能,网上的资料很多,但是有一部分有bug,这篇文章是我学习和解决部分bug之后的总结.今天带来的是RecyclerView的A-Z字母排序和过滤搜索功 ...
- Android 仿2016版京东筛选
之前传了github,忘了更新,给大家带来的不便请谅解! https://github.com/SimbaLiu/filter.github.io 京东筛选更新了,很好,很炫酷.那什么,我们也不差是吧 ...
- Android仿饿了么搜索功能
仿饿了么搜索框 这里采用的是pupupWindow来实现,一个全屏的popupWindow里面放各个View做对应操作 首先是activity_popup.xml布局,很简单,就一个带背景的TextV ...
- android饿了么购物车,Android仿饿了么加入购物车旋转控件自带闪转腾挪动画的按钮效果(实例详解)...
概述 在上文,酷炫Path动画已经预告了,今天给大家带来的是利用 纯自定义View,实现的仿饿了么加入购物车控件,自带闪转腾挪动画的按钮. 效果图如下: 图1 项目中使用的效果,考虑到了View的回收 ...
- Android自定义控件开发系列(三)——仿支付宝六位支付密码输入页面
在移动互联领域,有那么几家龙头一直是我等学习和追求的目标,比如支付宝.微信.饿了么.酷狗音乐等等,大神举不胜举,他们设计的界面.交互方式已经培养了中国(有可能会是世界)民众的操作习惯:举个小例子,对话 ...
- android中仿qq最新版抽屉,Android实现3种侧滑效果(仿qq侧滑、抽屉侧滑、普通侧滑)...
自己实现了一下侧滑的三种方式(注释都写代码里了) 本文Demo下载地址:Andriod侧滑 本文实现所需框架:nineoldandroids下载地址:nineoldandroids 1.普通侧滑: 主 ...
- android仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...
Android实现简单底部导航栏 Android仿微信滑动切换效果 发布时间:2020-10-09 19:48:00 来源:脚本之家 阅读:96 作者:丶白泽 Android仿微信滑动切换最终实现效果 ...
- 【Android视图效果】共享元素实现仿微信查看大图效果
在之前的文章中,我们通过动画实现了这个,具体可以查看[Android 动画]动画详解之仿微信查看大图效果(四),这里,我们用过度动画来实现. 什么是共享元素? 它是Android 5.0新加入的一种过 ...
- Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View...
Android特效专辑(十二)--仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View 先来看看这个效果 这是我的在Only上添加的效果,说实话,Only现在都还只是半成品,台面都上不了,怪自己技术 ...
最新文章
- 鸿蒙之后华为把欧拉也捐了,还承诺不做欧拉商用发行版
- Android 使用OpenCV的三种方式(Android Studio)
- ajax和Java session监听
- 【转帖】配置管理计划(CM Plan)
- Linux平台上SQLite数据库教程(一)——终端使用篇
- mysql 临时表 限制_Mysql临时表
- jQuery省市联动
- 使用c++为node.js扩展模块
- 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(七)
- 关键字--static
- 十次方项目开发系列【3】:基于MyBatis Plus实现条件查询和分页
- 运放失调电压和开环增益,PSRR,CMRR的关系
- vue项目将localhost改成自己的ip访问
- 全息投影是计算机技术吗,3D全息投影技术怎么应用在展厅的?
- 【机器学习】(十)核支持向量机SVM:make_blobs方法,hstack() 函数
- 诸葛亮舌战群儒的技术分析总结
- Calendar 获得当前日期是这一年的第几天
- win7上安装microsoft edge浏览器, 模拟ie11模式
- 一款基于Flutter开发的语雀APP
- Advanced Installer多语言包安装
热门文章
- 【个人笔记】OpenCV4 C++ 图像处理与视频分析 04课
- python any all
- Git 小问题:fatal: not a git repository (or any of the parent directories): .git
- npm i 命令长时间卡住的解决办法
- 从前端到后台,开发一个完整功能的小程序
- Mac上搭建Go语言环境及第一个hello.go程序
- resiprocate之message
- python图像转字符画_Python3:图片转字符画
- linux学习笔记:我的第一个shell脚本
- 以下不属于计算机综合处理多媒体信息的有,国家开放大学《多媒体应用技术基础》第一-二次形成性考核任务试题...