【Android】快速实现仿美团选择城市界面

上文提到,重构后,SuspensionDecoration数据源依赖的接口是ISuspensionInterface

如下:

public interface ISuspensionInterface {

//是否需要显示悬停title

boolean isShowSuspension();

//悬停的title

String getSuspensionTag();

}

BaseIndexBean里实现,默认显示悬停,分组title和IndexBar的Tag是一样的。

public abstract class BaseIndexBean implements ISuspensionInterface {

private String baseIndexTag;//所属的分类(城市的汉语拼音首字母)

@Override

public String getSuspensionTag() {

return baseIndexTag;

}

@Override

public boolean isShowSuspension() {

return true;

}

}

BaseIndexPinyinBean类,现在如下:

public abstract class BaseIndexPinyinBean extends BaseIndexBean {

private String baseIndexPinyin;//城市的拼音

//是否需要被转化成拼音, 类似微信头部那种就不需要 美团的也不需要

//微信的头部 不需要显示索引

//美团的头部 索引自定义

//默认应该是需要的

public boolean isNeedToPinyin() {

return true;

}

//需要转化成拼音的目标字段

public abstract String getTarget();

}

所以我们需要实现微信那种效果,只需要重写isShowSuspension()isNeedToPinyin()这两个方法,并setBaseIndexTag()直接设置tag即可。

仿美团选择城市

=======

这个页面还是挺麻烦的,所以步骤也最多。建议结合代码阅读Demo及库地址

分析美团选择城市列表:

* 主体部分仍旧是一个普通的 分组悬停&索引导航 的列表(美团没有悬停功能)。

* 头部是由若干复杂HeaderView组成。

* 从右侧索引栏可以看出,定位、最近、热门这三个Item对应了列表三个HeaderView。

* 最顶部的HeaderView是不需要分组,也不需要索引的。

那么逐一实现:

主体部分

很简单,根据前文最后的封装( 第二篇戳我),如果只有主体部分,我们需要让主体部分的JavaBean继承自BaseIndexPinyinBean,然后正常构建数据,最终设置给IndexBar和SuspensionDecoration即可。

public class MeiTuanBean extends BaseIndexPinyinBean {

private String city;//城市名字

@Override

public String getTarget() {

return city;

}

}

头部若干HeaderViews

这里不管是通过HeaderView添加进来头部布局,还是通过itemViewType自己去实现,核心都是通过itemViewType去做的。

也就是说头部的HeaderView也是RecyclerView的Item。

既然是Item一定对应着相应的JavaBean。

我们需要针对这些JavaBean让其分别继承BaseIndexPinyinBean

具体怎么实现头部布局不是本文重点,不再赘述,Demo里有代码可细看Demo及库地址

定、近、热三个HeaderView的处理

定、近、热三个HeaderView有如下特点:

* 右侧导航索引的title 为自定义,不是拼音首字母则也不需要排序。

* 悬停分组的title 和 右侧导航索引的title 不一样,则悬停分组的title也需要自定义

做法:

不过既然是RecyclerView里的Item,又有 悬停分组、索引导航 特性。那么就要继承BaseIndexPinyinBean

* 不需要转化成拼音且不排序,则重写isNeedToPinyin()返回false,并调用setBaseIndexTag(indexBarTag)给右侧索引赋值。

* 需要自定义悬停分组的title,则重写getSuspensionTag()返回title。

public class MeituanHeaderBean extends BaseIndexPinyinBean {

private List cityList;

//悬停ItemDecoration显示的Tag

private String suspensionTag;

public MeituanHeaderBean(List cityList, String suspensionTag, String indexBarTag) {

this.cityList = cityList;

this.suspensionTag = suspensionTag;

this.setBaseIndexTag(indexBarTag);

}

@Override

public String getTarget() {

return null;

}

@Override

public boolean isNeedToPinyin() {

return false;

}

@Override

public String getSuspensionTag() {

return suspensionTag;

}

}

private List<MeituanHeaderBean> mHeaderDatas; 保存定、近、热头部数据源,最终需要将其设置给IndexBarSuspensionDecoration

mHeaderDatas = new ArrayList<>();

List locationCity = new ArrayList<>();

locationCity.add(“定位中”);

mHeaderDatas.add(new MeituanHeaderBean(locationCity, “定位城市”, “定”));

List recentCitys = new ArrayList<>();

mHeaderDatas.add(new MeituanHeaderBean(recentCitys, “最近访问城市”, “近”));

List hotCitys = new ArrayList<>();

mHeaderDatas.add(new MeituanHeaderBean(hotCitys, “热门城市”, “热”));

最顶部的HeaderView

最顶部的HeaderView,由于不需要右侧索引,也没有悬停分组。它只是一个普通的HeaderView即可。

对于这种需求的HeaderView,只需要将它们的数量传给IndexBarSuspensionDecoration 即可。

在内部我已经做了处理,保证联动坐标和数据源下标的正确。

mDecoration.setHeaderViewCount(mHeaderAdapter.getHeaderViewCount() - mHeaderDatas.size()));

mIndexBar.setHeaderViewCount(mHeaderAdapter.getHeaderViewCount() - mHeaderDatas.size());

这里用headerView一共的count=4,减去上步中mHeaderDatas的size =3,得出不需要右侧索引,也没有悬停分组 头部的数量。

将主体数据集和头部数据集合并

我们前几步中,设计到了三部分数据集,

一部分是主体数据集,

//主体部分数据源(城市数据)

private List mBodyDatas;

第二部分是需要特性的头部数据集

//头部数据源

private List mHeaderDatas;

第三部分是不需要特性的数据集,这里忽略。我们只用到它的count。

我们需要将第一和第二部分融合,并且设置给IndexBarSuspensionDecoration

则我们利用它们共同的基类,BaseIndexPinyinBean来存储。

核心代码如下:

//设置给InexBar、ItemDecoration的完整数据集

private List mSourceDatas;

mSourceDatas.addAll(mHeaderDatas);

mSourceDatas.addAll(mBodyDatas);

设置给IndexBar

mIndexBar.setmPressedShowTextView(mTvSideBarHint)//设置HintTextView

.setNeedRealIndex(true)//设置需要真实的索引

.setmLayoutManager(mManager)//设置RecyclerView的LayoutManager

.setHeaderViewCount(mHeaderAdapter.getHeaderViewCount() - mHeaderDatas.size());

.setmSourceDatas(mSourceDatas)//设置数据

设置给SuspensionDecoration

mRv.addItemDecoration(new SuspensionDecoration(this, mSourceDatas)

.setHeaderViewCount(mHeaderAdapter.getHeaderViewCount() - mHeaderDatas.size()));

效果图如文首。

核心代码

这里再提一点,我已经将排序功能抽离至IndexBarIIndexBarDataHelper类型变量中去做,

mIndexBar.setmSourceDatas(mSourceDatas)时会自动排序。

也可以手动调用mIndexBar.getDataHelper().sortSourceDatas(mBodyDatas);排序。

像本节的案例,可以选择先排序bodyDatas,然后再合并至sourceDatas,最终设置给IndexBarSuspensionDecoration

如:

//先排序

mIndexBar.getDataHelper().sortSourceDatas(mBodyDatas);

mSourceDatas.addAll(mBodyDatas);

mIndexBar.setmSourceDatas(mSourceDatas)//设置数据

.invalidate();

mDecoration.setmDatas(mSourceDatas);

涉及到的重构代码:

除了上节提到的那些数据结构的重构,

我还将以前在IndexBar里完成的:

  • 1 将汉语转成拼音

  • 2 填充indexTag

  • 3 排序源数据源

  • 4 根据排序后的源数据源->indexBar的数据源

抽成一个接口表示,与IndexBar分离。

/**

  • 介绍:IndexBar 的 数据相关帮助类

  • 1 将汉语转成拼音

  • 2 填充indexTag

  • 3 排序源数据源

  • 4 根据排序后的源数据源->indexBar的数据源

  • 作者:zhangxutong

  • 邮箱:mcxtzhang@163.com

  • 主页:http://blog.csdn.net/zxt0601

  • 时间: 2016/11/28.

*/

public interface IIndexBarDataHelper {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

尾声

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

[外链图片转存中…(img-YRkahmS4-1710853230295)]

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
[外链图片转存中…(img-GkooYn28-1710853230296)]

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android仿美团外卖源码是一款基于美团外卖的功能和界面进行开发的移动应用程序源代码。该源码提供了一套完整的应用程序框架和功能实现,供开发者参考和使用。 源码的主要功能包括用户登录注册、商家入驻与验证、商品浏览与搜索、购物车管理、订单提交与支付等。用户可以通过注册登录功能创建自己的账户,并且进行基本信息的管理。商家可以通过入驻与验证功能进行店铺的注册与认证,以便能够向用户展示自己的商品。 用户可以浏览商家提供的商品,并通过搜索功能查找自己感兴趣的商品。在商品详情页,用户可以查看商品的详细信息和评价,并选择加入购物车或直接购买。购物车管理功能允许用户查看自己已选中的商品,修改数量或删除商品。 当用户完成商品选择后,可以通过订单提交与支付功能来确认订单并进行支付。该功能通常会调用第三方支付平台,比如支付宝或微信支付,来完成支付过程。 除了上述核心功能,源码还提供了一些其他的辅助功能,比如地址管理、订单历史、评价管理等。这些功能提供了更好的用户体验和商家管理能力。 总而言之,Android仿美团外卖源码是一套具备基本外卖功能的应用程序源代码,为开发者提供了快速开发类似应用的能力,并且可以根据实际需求进行二次开发和定制。 ### 回答2: Android仿美团外卖源码是一种基于Android平台开发的应用程序源代码,旨在模仿美团外卖的功能和界面设计。通过使用这个源码,开发者可以构建出类似美团外卖的应用程序。 这个源码通常包含了以下主要功能模块:用户登录注册、附近商家展示、搜索商家/菜品、下单流程、支付功能、订单管理、评价功能等。 用户登录注册模块提供用户注册和登录的功能,用户可以通过手机号码或第三方登录方式进行注册和登录。 附近商家展示模块通过获取用户当前位置信息,展示附近的商家列表,用户可以根据自己的需求选择商家。 搜索商家/菜品模块允许用户按照商家名称、菜品关键字等进行搜索,从而快速找到想要的商家和菜品。 下单流程模块允许用户选择商家和菜品,添加到购物车,选择送货地址和支付方式,并提交订单。 支付功能模块提供了用户支付订单的功能,用户可以通过支付宝、微信等支付渠道进行支付。 订单管理模块允许用户查看自己的订单列表,包括已完成、待支付、待送货等状态的订单。 评价功能模块提供了用户对商家和菜品进行评价的功能,用户可以给商家和菜品打分并留下评价。 通过使用这个源码,开发者可以根据自己的需要进行定制,比如更改应用的主题色彩、商家和菜品的分类方式,或者添加一些新的功能模块。开发者还可以根据美团外卖的设计和用户体验理念,来提升自己应用的质量和用户满意度。 总之,Android仿美团外卖源码为开发者提供了一个快速开发类似美团外卖的应用程序的基础框架,降低了开发难度,节省了开发时间,同时也帮助开发者提供了一个优质的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值