前言

本文主要给大家介绍了关于Android模仿美团顶部滑动菜单的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
先来看下效果图:
实现方法
这是通过 ViewPager 和 GridView 相结合做出来的效果,每一个 ViewPager 页面都是一个 GridView,底部的每个滑动指示圆点都是从布局文件中 inflate 出来的
首先需要一个代表每个活动主题的 JavaBean
/**
* Created by CZY on 2017/6/23.
*/
public class Subject {
//主题名
private String name;
//主题图标资源ID
private int icon;
public Subject(String name, int icon) {
this.name = name;
this.icon = icon;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIcon() {
return icon;
}
public void setIcon(int icon) {
this.icon = icon;
}
}
然后用一个 List< Subject > 来承载需要显示的所有主题内容,将这些数据传给 GridViewAdapter 。因为 ViewPager 有几个页面就有几个GridView ,每个GridView对应的是哪些数据都需要在其内部根据页面索引进行计算
/**
* Created by CZY on 2017/6/23.
*/
public class GridViewAdapter extends BaseAdapter {
private List<Subject> subjectList;
private LayoutInflater layoutInflater;
//当前页索引
private int currentIndex;
//占满屏幕时每页展示的主题个数
private int pageSize;
public GridViewAdapter(Context context, List<Subject> subjectList, int currentIndex, int pageSize) {
this.layoutInflater = LayoutInflater.from(context);
this.subjectList = subjectList;
this.currentIndex = currentIndex;
this.pageSize = pageSize;
}
/**
* 如果剩余数据能够完全占满当前页,则返回 pageSize
* 如果不能,则返回剩余的数据个数
*/
@Override
public int getCount() {
return subjectList.size() > (currentIndex + 1) * pageSize ? pageSize : (subjectList.size() - currentIndex * pageSize);
}
/**
* 计算出正确的索引
*/
@Override
public Object getItem(int position) {
return subjectList.get(position + currentIndex * pageSize);
}
@Override
public long getItemId(int position) {
return position + currentIndex * pageSize;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.item_grid_view, parent, false);
viewHolder = new ViewHolder();
viewHolder.tv_subject = (TextView) convertView.findViewById(R.id.tv_subject);
viewHolder.iv_subject = (ImageView) convertView.findViewById(R.id.iv_subject);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
int pos = position + currentIndex * pageSize;
viewHolder.tv_subject.setText(subjectList.get(pos).getName());
viewHolder.iv_subject.setImageResource(subjectList.get(pos).getIcon());
return convertView;
}
private class ViewHolder {
private TextView tv_subject;
private ImageView iv_subject;
}
}
需要使用到的布局文件 item_grid_view 如下所示
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="10dp" android:paddingTop="10dp"> <ImageView android:id="@+id/iv_subject" android:layout_width="40dp" android:layout_height="40dp" android:layout_centerHorizontal="true" /> <TextView android:id="@+id/tv_subject" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/iv_subject" android:layout_centerHorizontal="true" android:layout_marginTop="3dp" android:textSize="12sp" /> </RelativeLayout>
使用到了 ViewPager,自然也需要一个 ViewPagerAdapter
/**
* Created by CZY on 2017/6/23.
*/
public class ViewPagerAdapter extends PagerAdapter {
private List<View> viewList;
public ViewPagerAdapter(List<View> viewList) {
this.viewList = viewList;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
return (viewList.get(position));
}
@Override
public int getCount() {
return viewList == null ? 0 : viewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
在 MainActivity 中进行数据填充
public class MainActivity extends AppCompatActivity {
private String[] titles = {"美食", "电影", "酒店住宿", "休闲娱乐", "甜品饮品",
"水上乐园", "汽车服务", "美发", "丽人", "景点",
"足疗按摩", "运动健身", "健身", "超市", "买菜",
"今日新单", "外卖", "自助餐", "KTV", "机票/火车票",
"周边游", "小吃快餐", "面膜", "美甲美睫", "火锅",
"生日蛋糕", "母婴亲子", "生活服务", "婚纱摄影", "学习培训",
"家装", "结婚"};
private List<Subject> subjectList;
private LinearLayout ll_dot;
//每页展示的主题个数
private final int pageSize = 10;
//当前页索引
private int currentIndex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
ll_dot = (LinearLayout) findViewById(R.id.ll_dot);
subjectList = new ArrayList<>();
for (String title : titles) {
subjectList.add(new Subject(title, R.drawable.icon));
}
//需要的页面数
int pageCount = (int) Math.ceil(subjectList.size() * 1.0 / pageSize);
List<View> viewList = new ArrayList<>();
for (int i = 0; i < pageCount; i++) {
GridView gridView = (GridView) getLayoutInflater().inflate(R.layout.layout_grid_view, viewPager, false);
gridView.setAdapter(new GridViewAdapter(this, subjectList, i, pageSize));
viewList.add(gridView);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int pos = position + currentIndex * pageSize;
Toast.makeText(MainActivity.this, subjectList.get(pos).getName(), Toast.LENGTH_SHORT).show();
}
});
}
viewPager.setAdapter(new ViewPagerAdapter(viewList));
for (int i = 0; i < pageCount; i++) {
ll_dot.addView(getLayoutInflater().inflate(R.layout.view_dot, null));
}
//使第一个小圆点呈选中状态
ll_dot.getChildAt(0).findViewById(R.id.v_dot).setBackgroundResource(R.drawable.dot_selected);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
public void onPageSelected(int position) {
ll_dot.getChildAt(currentIndex).findViewById(R.id.v_dot).setBackgroundResource(R.drawable.dot_normal);
ll_dot.getChildAt(position).findViewById(R.id.v_dot).setBackgroundResource(R.drawable.dot_selected);
currentIndex = position;
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
public void onPageScrollStateChanged(int arg0) {
}
});
}
}
每一个小圆点都对应一个布局文件,其中只包含一个View,重点是设置是设备其 background 属性,使其呈现圆形
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <View android:id="@+id/v_dot" android:layout_width="8dp" android:layout_height="8dp" android:layout_marginLeft="2dp" android:layout_marginRight="2dp" android:background="@drawable/dot_normal" /> </RelativeLayout>
代码整体来说都挺简单的,这里也提供源代码下载:仿美团顶部滑动菜单
总结
以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# android
# 仿美团菜单
# 仿美团滑动
# 美团菜单
# Android实现顶部导航菜单左右滑动效果
# Android实现自定义滑动式抽屉菜单效果
# android RecyclerView侧滑菜单
# 滑动删除
# 长按拖拽
# 下拉刷新上拉加载
# Android滑动优化高仿QQ6.0侧滑菜单(滑动优化)
# Android仿微信滑动弹出编辑、删除菜单效果、增加下拉刷新功能
# Android利用滑动菜单框架实现滑动菜单效果
# Android Studio使用ViewPager+Fragment实现滑动菜单Tab效果
# Android自定义横向滑动菜单的实现
# Android仿人人客户端滑动菜单的侧滑菜单效果
# Android实现左侧滑动菜单
# 每页
# 当前页
# 的是
# 都是
# 这是
# 占满
# 几个
# 相关内容
# 第一个
# 就有
# 说了
# 小圆点
# 不多
# 是从
# 给大家
# 有几个
# 使其
# 甜品
# 所示
# 这篇文章
相关文章:
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
如何高效利用亚马逊云主机搭建企业网站?
建站三合一如何选?哪家性价比更高?
如何快速搭建响应式可视化网站?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
建站主机是否等同于虚拟主机?
如何通过虚拟主机快速完成网站搭建?
威客平台建站流程解析:高效搭建教程与设计优化方案
如何在橙子建站上传落地页?操作指南详解
建站之星在线客服如何快速接入解答?
建站上传速度慢?如何优化加速网站加载效率?
如何选择PHP开源工具快速搭建网站?
建站之星安装失败:服务器环境不兼容?
制作网站怎么制作,*游戏网站怎么搭建?
如何续费美橙建站之星域名及服务?
北京专业网站制作设计师招聘,北京白云观官方网站?
C#如何使用XPathNavigator高效查询XML
如何有效防御Web建站篡改攻击?
家庭服务器如何搭建个人网站?
建站之星北京办公室:智能建站系统与小程序生成方案解析
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
小建面朝正北,A点实际方位是否存在偏差?
建站主机无法访问?如何排查域名与服务器问题
MySQL查询结果复制到新表的方法(更新、插入)
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
如何快速上传自定义模板至建站之星?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
建站之星如何防范黑客攻击与数据泄露?
如何选择美橙互联多站合一建站方案?
制作企业网站建设方案,怎样建设一个公司网站?
h5在线制作网站电脑版下载,h5网页制作软件?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何在Windows服务器上快速搭建网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
建站与域名管理如何高效结合?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
如何通过西部建站助手安装IIS服务器?
网站设计制作企业有哪些,抖音官网主页怎么设置?
如何用y主机助手快速搭建网站?
建站之星价格显示格式升级,你的预算足够吗?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
建站DNS解析失败?如何正确配置域名服务器?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
*请认真填写需求信息,我们会在24小时内与您取得联系。