我与Android美团主菜单有个约定<->
来源:互联网 发布:unity3d玻璃材质包 编辑:程序博客网 时间:2024/04/20 05:28
相信大家对于菜单应该不陌生了吧,有上下文菜单,自定义菜单,而我今天讲的是自定义GridView+ViewPager实现仿美团菜单效果下面废话不多说直接上效果图,别闭眼哈哈!
接下讲一些思路以及一些细节处理
- GridView分页处理 - 具体步骤和实现
GridView分页处理你每页显示的多少个GridView item以及当前页数,还有总页数,可能有些不能取整因此需要做一些简单算法处理具体代码实现如下
//总的页数=总数/每页数量,并取整 pageCount = (int) Math.ceil(mLists.size() * 1.0 / pageSize); mPagerList = new ArrayList<View>(); for (int i = 0; i < pageCount; i++) { //每个页面都是inflate出一个新实例 GridView gridView = (GridView) minflater.inflate(R.layout.gridview, mViewPager, false); gridView.setAdapter(new GridViewAdapter(GridViewActivity.this, mLists, i, pageSize)); mPagerList.add(gridView); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { int pos = position + curIndex * pageSize; Toast.makeText(GridViewActivity.this, mLists.get(pos).getName(), Toast.LENGTH_SHORT).show(); } }); } //设置适配器 mViewPager.setAdapter(new ViewPageAdapter(mPagerList)); //设置圆点 setOvalLayout(); }
具体步骤包括以下几步
1、首先创建一个主GridViewActivity 里面主要包括GridView显示的标题以及ImageView显示的图片资源然后实现下面的小点左右滑动切换位置销毁之前的View
2、创建一个GridViewAdapter里面包括当前显示的页数以及每页现实的PageSize大小,然后将存放的数据通过ImageView和TextView显示出来显示在GridView中然后将它与BViewPager关联
3、创建一个MeiTuan bean实体类 里面包括显示的标题名称以及图片资源生成对应的get/set方法或者构造方法等
4、最后通过在主Activity调用相应的方法实现最终的效果
主Activity初始化代码如下
private void initView() { // 初始化UI组件 mViewPager = (ViewPager) findViewById(R.id.vp); mLlDot = (LinearLayout) findViewById(R.id.ll_dot); }
加载数据代码如下
/** * 初始化数据源 */ private void initDatas() { mLists = new ArrayList<MeiTuan>(); for (int i = 0; i < titles.length; i++) { //动态获取资源ID,第一个参数是资源名,第二个参数是资源类型例如drawable,mipmap string等,第三个参数包名 int imageId = getResources().getIdentifier("ic_category_" + i, "drawable", getPackageName()); /**需要注意的是我这里用的是IDE所以是res目录下的drawable否则会报错如果你用的是idea就是mipmap**/ mLists.add(new MeiTuan(titles[i], imageId)); } }
显示标题数组具体代码如下
private String[] titles = {"美食", "电影", "酒店住宿", "休闲娱乐", "外卖", "自助餐", "KTV", "机票/火车票", "周边游", "美甲美睫", "火锅", "生日蛋糕", "甜品饮品", "水上乐园", "汽车服务", "美发", "丽人", "景点", "足疗按摩", "运动健身", "健身", "超市", "买菜", "今日新单", "小吃快餐", "面膜", "洗浴/汗蒸", "母婴亲子", "生活服务", "婚纱摄影", "学习培训", "家装", "结婚", "全部分类"};
设置圆点是否选中具体实现如下
/** * 设置圆点 */ public void setOvalLayout() { /**遍历所有的GridView显示的总页数**/ for (int i = 0; i < pageCount; i++) { mLlDot.addView(minflater.inflate(R.layout.dot, null)); } // 默认显示第一页// mPager.setCurrentItem(0);// mLlDot.getChildAt(0).setEnabled(true); mLlDot.getChildAt(0).findViewById(R.id.v_dot) .setBackgroundResource(R.drawable.dot_selected); /**添加一个onPageChangeListener**/ mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { public void onPageSelected(int position) { // 取消圆点选中 mLlDot.getChildAt(curIndex) .findViewById(R.id.v_dot) .setBackgroundResource(R.drawable.dot_normal); // 圆点选中 mLlDot.getChildAt(position) .findViewById(R.id.v_dot) .setBackgroundResource(R.drawable.dot_selected); curIndex = position; } public void onPageScrolled(int arg0, float arg1, int arg2) { } public void onPageScrollStateChanged(int arg0) { } }); }
接下来是GridViewAdapter适配器实现
public class GridViewAdapter extends BaseAdapter { /**用来存放list集合**/ private List<MeiTuan> mList; /**上下文对象**/ private Context mContext; /**布局文件**/ private LayoutInflater mLayoutInflater; /**当前页**/ private int curIndex; /**每页大小**/ private int pageSize; public GridViewAdapter(Context mContext,List<MeiTuan> mList,int curIndex,int pageSize) { //初始化 mLayoutInflater=LayoutInflater.from(mContext); this.mList=mList; this.mContext=mContext; this.curIndex=curIndex; this.pageSize=pageSize; } @Override public int getCount() { //当前item条目 return mList.size()>(curIndex+1)*pageSize?pageSize:(mList.size()-curIndex*pageSize); } @Override public Object getItem(int position) { // 当前item的position+curIndex*pageSize return mList.get(position+curIndex*pageSize); } @Override public long getItemId(int position) { return position+curIndex*pageSize; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder=null; /**判断是否为空 * 是 创建一个ViewHolder对象 * 否则返回 * **/ if(convertView==null){ /**加载布局文件**/ convertView=mLayoutInflater.inflate(R.layout.item_gridview, null); holder=new ViewHolder(); holder.iv_iconRes=(ImageView) convertView.findViewById(R.id.imageView); holder.tv_name=(TextView) convertView.findViewById(R.id.textView); /**设置一个Tag标记**/ convertView.setTag(holder); }else{ /**获取一个Tag标记**/ holder=(ViewHolder) convertView.getTag(); } /**获取当前位置**/ int pos=position+curIndex*pageSize;// String name=mList.get(position).getName();// int iconRes=mList.get(position).getIconRes();/**将对应的图片显示在ImageView中**/ holder.iv_iconRes.setImageResource(mList.get(pos).getIconRes());/**将标题显示的TextView中**/ holder.tv_name.setText(mList.get(pos).getName()); return convertView; } /**创建一个ViewHolder对象**/ static class ViewHolder{ TextView tv_name; ImageView iv_iconRes; }}
到这里可能用的人会问哪里的图片标题要不要创建一个实体类,这个问题问的好,那继续?MeiTuan实体类代码
public class MeiTuan { /**显示标题**/ private String name; /**显示图片资源**/ private int iconRes; public String getName() { return name; } public MeiTuan(String name, int iconRes) { this.name = name; this.iconRes = iconRes; } public void setName(String name) { this.name = name; } public int getIconRes() { return iconRes; } public void setIconRes(int iconRes) { this.iconRes = iconRes; }}
到这里差不多了,但是还要创建一个
ViewPageAdapter用来切换不同的GridView视图随着小圆点的移动位置不同代码如下我就不再赘述
public class ViewPageAdapter extends PagerAdapter{ private List<View> mList; public ViewPageAdapter(List<View> mList) { this.mList=mList; } @Override public void destroyItem(ViewGroup container, int position, Object object) { // 销毁之前的view container.removeView(mList.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) { // 添加view container.addView(mList.get(position)); return mList.get(position); } @Override public int getCount() { /**判断list集合是否为空**/ if(mList==null){ return 0; } return mList.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0==arg1; }}
最后就是GridViewActivity全部代码
public class GridViewActivity extends Activity { private static final String TAG="GridViewActivity"; private String[] titles = {"美食", "电影", "酒店住宿", "休闲娱乐", "外卖", "自助餐", "KTV", "机票/火车票", "周边游", "美甲美睫", "火锅", "生日蛋糕", "甜品饮品", "水上乐园", "汽车服务", "美发", "丽人", "景点", "足疗按摩", "运动健身", "健身", "超市", "买菜", "今日新单", "小吃快餐", "面膜", "洗浴/汗蒸", "母婴亲子", "生活服务", "婚纱摄影", "学习培训", "家装", "结婚", "全部分类"}; private ViewPager mViewPager; private List<View> mPagerList; private List<MeiTuan> mLists; private LinearLayout mLlDot; private LayoutInflater minflater; /** * 总的页数 */ private int pageCount; /** * 每一页显示的个数 */ private int pageSize = 10; /** * 当前显示的是第几页 */ private int curIndex = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initView(); //初始化数据源 initDatas(); minflater = LayoutInflater.from(this); //总的页数=总数/每页数量,并取整 pageCount = (int) Math.ceil(mLists.size() * 1.0 / pageSize); mPagerList = new ArrayList<View>(); for (int i = 0; i < pageCount; i++) { //每个页面都是inflate出一个新实例 GridView gridView = (GridView) minflater.inflate(R.layout.gridview, mViewPager, false); gridView.setAdapter(new GridViewAdapter(GridViewActivity.this, mLists, i, pageSize)); mPagerList.add(gridView); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { int pos = position + curIndex * pageSize; Toast.makeText(GridViewActivity.this, mLists.get(pos).getName(), Toast.LENGTH_SHORT).show(); } }); } //设置适配器 mViewPager.setAdapter(new ViewPageAdapter(mPagerList)); //设置圆点 setOvalLayout(); } private void initView() { // 初始化UI组件 mViewPager = (ViewPager) findViewById(R.id.vp); mLlDot = (LinearLayout) findViewById(R.id.ll_dot); } /** * 初始化数据源 */ private void initDatas() { mLists = new ArrayList<MeiTuan>(); for (int i = 0; i < titles.length; i++) { //动态获取资源ID,第一个参数是资源名,第二个参数是资源类型例如drawable,min_mapstring等,第三个参数包名 int imageId = getResources().getIdentifier("ic_category_" + i, "drawable", getPackageName()); mLists.add(new MeiTuan(titles[i], imageId)); } } /** * 设置圆点 */ public void setOvalLayout() { for (int i = 0; i < pageCount; i++) { mLlDot.addView(minflater.inflate(R.layout.dot, null)); } // 默认显示第一页// mPager.setCurrentItem(0);// mLlDot.getChildAt(0).setEnabled(true); mLlDot.getChildAt(0).findViewById(R.id.v_dot) .setBackgroundResource(R.drawable.dot_selected); /**添加一个onPageChangeListener左右滑动切换监听事件**/ mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { public void onPageSelected(int position) { // 取消圆点选中 mLlDot.getChildAt(curIndex) .findViewById(R.id.v_dot) .setBackgroundResource(R.drawable.dot_normal); // 圆点选中 mLlDot.getChildAt(position) .findViewById(R.id.v_dot) .setBackgroundResource(R.drawable.dot_selected); curIndex = position; } public void onPageScrolled(int arg0, float arg1, int arg2) { } public void onPageScrollStateChanged(int arg0) { } }); }}
到这里是不是感觉不是很难,需要注意点是如何分页显示而且规定每页显示的pageSize有的不够该如何处理,另外就是处理圆点的是否选中等。布局文件我就不贴了需要的加群扫码,另外转载请注明出处!谢谢!
- 我与Android美团主菜单有个约定<->
- 我与狗狗的十个约定
- Android 自定义主菜单
- IClass与电源管理(主菜)
- android 返回主菜单 Home
- Android 程序主菜单 布局
- Android之动画主菜单
- Android游戏开发之绘制游戏主菜单与进度条加载进度(十三)
- (转)Android游戏开发之绘制游戏主菜单与进度条加载进度(十三)
- Android游戏开发之绘制游戏主菜单与进度条加载进度
- 我的美团面试
- android 仿iphone主题之主菜单
- android 仿iphone主题之主菜单
- android,点击返回按钮回到主菜单
- Android Launcher3主菜单背景改为黑色
- 调用约定与修饰名约定
- 函数调用约定与名字修饰约定
- 函数调用约定与名字修饰约定
- Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
- ArcEngine 异常:field is not editable
- SQL语句的解析顺序
- css学习记录
- vn.trader的Ubuntu运行环境搭建教程
- 我与Android美团主菜单有个约定<->
- IntelliJ IDEA 请求的操作无法在使用用户映射区域打开的文件上执行
- 每天一道前端面试题--throttle与debounce
- vn.trader使用教程系列1-安装和配置
- 一些个人的思考
- RMQ问题解析
- vn.trader使用教程系列2-基础交易
- J0004. NetBeans自动提示功能设置
- spring Aop备忘