成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android快速實現(xiàn)美團、餓了么首頁分頁導航菜單功能

移動開發(fā) Android
前段時間公司移動端App新增一個模塊,類似美團團購的功能,首頁有個類似美團的分頁菜單的功能,用過美團和餓了么的app的童鞋應該清楚這一功能。首頁菜單可以分頁切換,類似我們的banner廣告切換效果,只不過只能手動切換。

前段時間公司移動端App新增一個模塊,類似美團團購的功能,首頁有個類似美團的分頁菜單的功能,用過美團和餓了么的app的童鞋應該清楚這一功能。首頁菜單可以分頁切換,類似我們的banner廣告切換效果,只不過只能手動切換。所以整個分頁效果,我們可以采用Viewpager實現(xiàn),里面的菜單項我們則可以采用RecyclerView實現(xiàn),動態(tài)改變里面的菜單項,以后產(chǎn)品汪要改需求也是一兩行代碼能搞定的事,是不是很機智。所以今天我們這個首頁分頁菜單效果,可以采用ViewPager+RecyclerView實現(xiàn),思路既然已經(jīng)有了,那我們就開整吧。首先我們先看下實現(xiàn)的效果圖。

Android快速實現(xiàn)美團、餓了么首頁分頁導航菜單功能

Android快速實現(xiàn)美團、餓了么首頁分頁導航菜單功能

Android快速實現(xiàn)美團、餓了么首頁分頁導航菜單功能

首頁布局文件,分頁指示器是單獨封裝的一個控件,后面會把代碼貼出來

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.               xmlns:app="http://schemas.android.com/apk/res-auto" 
  4.               android:id="@+id/home_entrance" 
  5.               android:layout_width="match_parent" 
  6.               android:layout_height="wrap_content" 
  7.               android:orientation="vertical"
  8.  
  9.     <android.support.v4.view.ViewPager 
  10.         android:id="@+id/main_home_entrance_vp" 
  11.         android:layout_width="match_parent" 
  12.         android:layout_height="wrap_content"/> 
  13.  
  14.     <com.stx.xhb.meituancategorydemo.widget.IndicatorView 
  15.         android:id="@+id/main_home_entrance_indicator" 
  16.         android:layout_width="match_parent" 
  17.         android:layout_height="32dp" 
  18.         android:layout_marginLeft="16dp" 
  19.         android:layout_gravity="bottom" 
  20.         android:layout_marginRight="16dp" 
  21.         app:gravity="0" 
  22.         app:indicatorColor="#668b8989" 
  23.         app:indicatorColorSelected="#FF5722" 
  24.         app:indicatorWidth="6"/> 
  25.  
  26. </LinearLayout> 

ViewPager中的子控件RecyclerView

  1. item_home_entrance_vp.xml  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
  3.                                         android:layout_width="match_parent" 
  4.                                         android:layout_height="wrap_content"/> 

接下來就是RecyclerView的菜單項的布局文件 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.              android:layout_width="match_parent" 
  4.              android:layout_height="match_parent"
  5.  
  6.     <LinearLayout 
  7.         android:layout_width="match_parent" 
  8.         android:layout_height="match_parent" 
  9.         android:gravity="center_horizontal" 
  10.         android:orientation="vertical" 
  11.         android:padding="6dp"
  12.  
  13.         <ImageView 
  14.             android:id="@+id/entrance_image" 
  15.             android:layout_width="wrap_content" 
  16.             android:layout_height="0dp" 
  17.             android:layout_margin="2dp" 
  18.             android:layout_weight="1" 
  19.             android:scaleType="fitCenter"/> 
  20.  
  21.         <TextView 
  22.             android:id="@+id/entrance_name" 
  23.             android:layout_width="wrap_content" 
  24.             android:layout_height="wrap_content" 
  25.             android:layout_margin="2dp" 
  26.             android:singleLine="true" 
  27.             android:textColor="#80000000" 
  28.             android:textSize="12dp"/> 
  29.     </LinearLayout> 
  30.  
  31.     <View 
  32.         android:layout_width="match_parent" 
  33.         android:layout_height="match_parent" 
  34.         android:background="@drawable/selector_trans_divider"/> 
  35.  
  36. </FrameLayout> 

布局都創(chuàng)建好了,接下來我們一起來看看里面的具體實現(xiàn)代碼了。由于我們的菜單項有一個icon和名稱name,為了方便管理,我們可以創(chuàng)建一個菜單項實體類ModelHomeEntrance.class

  1. /** 
  2.  * Author: Mr.xiao on 2017/5/23 
  3.  * 
  4.  * @mail:xhb_199409@163.com 
  5.  * @github:https://github.com/xiaohaibin 
  6.  * @describe:菜單項實體類 
  7.  */ 
  8. public class ModelHomeEntrance { 
  9.     private String name = ""
  10.     private int image; 
  11.  
  12.     public ModelHomeEntrance(String nameint image) { 
  13.         this.image = image; 
  14.         this.name = name
  15.     } 
  16.  
  17.  
  18.     public int getImage() { 
  19.         return image; 
  20.     } 
  21.  
  22.     public String getName() { 
  23.         return name
  24.     } 
  25.  

由于我們分頁效果是以ViewPager實現(xiàn)的,所以我們要創(chuàng)建一個ViewPager的適配器,CagegoryViewPagerAdapter.Class

  1. package com.stx.xhb.meituancategorydemo.adapter; 
  2.  
  3. import android.support.v4.view.PagerAdapter; 
  4. import android.view.View
  5. import android.view.ViewGroup; 
  6.  
  7. import java.util.List; 
  8.  
  9. /** 
  10.  * Created by jxnk25 on 2016/9/21. 
  11.  * 
  12.  * @link https://xiaohaibin.github.io/ 
  13.  * @email: xhb_199409@163.com 
  14.  * @github: https://github.com/xiaohaibin 
  15.  * @description:  首頁分類ViewPager適配器 
  16.  */ 
  17. public class CagegoryViewPagerAdapter extends PagerAdapter { 
  18.  
  19.     private List<View> mViewList; 
  20.     public CagegoryViewPagerAdapter(List<View> mViewList) { 
  21.         this.mViewList = mViewList; 
  22.     } 
  23.  
  24.     @Override 
  25.     public void destroyItem(ViewGroup container, int position, Object object) { 
  26.         container.removeView(mViewList.get(position)); 
  27.     } 
  28.  
  29.     @Override 
  30.     public Object instantiateItem(ViewGroup container, int position) { 
  31.         container.addView(mViewList.get(position)); 
  32.         return (mViewList.get(position)); 
  33.     } 
  34.  
  35.     @Override 
  36.     public int getCount() { 
  37.         if (mViewList == null
  38.             return 0; 
  39.         return mViewList.size(); 
  40.     } 
  41.  
  42.     @Override 
  43.     public boolean isViewFromObject(View view, Object object) { 
  44.         return view == object; 
  45.     } 

ViewPager的適配器有了,我們還得再創(chuàng)建一個RecyclerView的菜單項列表適配器,EntranceAdapter.Class 

  1. package com.stx.xhb.meituancategorydemo.adapter; 
  2.  
  3. import android.content.Context; 
  4. import android.support.v7.widget.RecyclerView; 
  5. import android.view.LayoutInflater; 
  6. import android.view.View
  7. import android.view.ViewGroup; 
  8. import android.widget.ImageView; 
  9. import android.widget.LinearLayout; 
  10. import android.widget.TextView; 
  11.  
  12. import com.stx.xhb.meituancategorydemo.R; 
  13. import com.stx.xhb.meituancategorydemo.model.ModelHomeEntrance; 
  14. import com.stx.xhb.meituancategorydemo.utils.ScreenUtil; 
  15.  
  16. import java.util.List; 
  17.  
  18. /** 
  19.  * Author: Mr.xiao on 2017/5/23 
  20.  * 
  21.  * @mail:xhb_199409@163.com 
  22.  * @github:https://github.com/xiaohaibin 
  23.  * @describe: 首頁分頁菜單項列表適配器 
  24.  */ 
  25. public class EntranceAdapter extends RecyclerView.Adapter<EntranceAdapter.EntranceViewHolder> { 
  26.  
  27.     private List<ModelHomeEntrance> mDatas; 
  28.  
  29.     /** 
  30.      * 頁數(shù)下標,從0開始(通俗講第幾頁) 
  31.      */ 
  32.     private int mIndex; 
  33.  
  34.     /** 
  35.      * 每頁顯示最大條目個數(shù) 
  36.      */ 
  37.     private int mPageSize; 
  38.  
  39.     private Context mContext; 
  40.  
  41.     private final LayoutInflater mLayoutInflater; 
  42.  
  43.     private List<ModelHomeEntrance> homeEntrances; 
  44.  
  45.     public EntranceAdapter(Context context, List<ModelHomeEntrance> datas, int indexint pageSize) { 
  46.         this.mContext = context; 
  47.         this.homeEntrances = datas; 
  48.         mPageSize = pageSize; 
  49.         mDatas = datas; 
  50.         mIndex = index
  51.         mLayoutInflater = LayoutInflater.from(context); 
  52.  
  53.     } 
  54.  
  55.     @Override 
  56.     public EntranceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
  57.         return new EntranceViewHolder(mLayoutInflater.inflate(R.layout.item_home_entrance, null)); 
  58.     } 
  59.  
  60.     @Override 
  61.     public void onBindViewHolder(EntranceViewHolder holder, final int position) { 
  62.         /** 
  63.          * 在給View綁定顯示的數(shù)據(jù)時,計算正確的position = position + mIndex * mPageSize, 
  64.          */ 
  65.         final int pos = position + mIndex * mPageSize; 
  66.         holder.entranceNameTextView.setText(homeEntrances.get(pos).getName()); 
  67.         holder.entranceIconImageView.setImageResource(homeEntrances.get(pos).getImage()); 
  68.         holder.itemView.setOnClickListener(new View.OnClickListener() { 
  69.             @Override 
  70.             public void onClick(View v) { 
  71.                 ModelHomeEntrance entrance = homeEntrances.get(pos); 
  72.                 // TODO: 2017/5/24 點擊事件處理 
  73.             } 
  74.         }); 
  75.     } 
  76.  
  77.     @Override 
  78.     public int getItemCount() { 
  79.         return mDatas.size() > (mIndex + 1) * mPageSize ? mPageSize : (mDatas.size() - mIndex * mPageSize); 
  80.     } 
  81.  
  82.     @Override 
  83.     public long getItemId(int position) { 
  84.         return position + mIndex * mPageSize; 
  85.     } 
  86.  
  87.     class EntranceViewHolder extends RecyclerView.ViewHolder { 
  88.  
  89.         private TextView entranceNameTextView; 
  90.         private ImageView entranceIconImageView; 
  91.  
  92.         public EntranceViewHolder(View itemView) { 
  93.             super(itemView); 
  94.             entranceIconImageView = (ImageView) itemView.findViewById(R.id.entrance_image); 
  95.             entranceNameTextView = (TextView) itemView.findViewById(R.id.entrance_name); 
  96.             LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) ((float) ScreenUtil.getScreenWidth() / 4.0f)); 
  97.             itemView.setLayoutParams(layoutParams); 
  98.         } 
  99.     } 

最后就是我們的MainActivity的代碼實現(xiàn)了,我們整體的思路其實就是需要根據(jù)首頁菜單項的數(shù)據(jù)源進行分頁顯示,首頁確定單頁菜單顯示數(shù)量,總數(shù)除以單頁顯示數(shù)量取整就是顯示頁數(shù),我們再根據(jù)頁數(shù)來創(chuàng)建RecyclerView將其添加到ViewPager的適配器中,下面就讓我們一起來看看具體是如何的。 

  1. package com.stx.xhb.meituancategorydemo; 
  2.  
  3. import android.os.Bundle; 
  4. import android.support.v4.view.ViewPager; 
  5. import android.support.v7.app.AppCompatActivity; 
  6. import android.support.v7.widget.GridLayoutManager; 
  7. import android.support.v7.widget.RecyclerView; 
  8. import android.view.LayoutInflater; 
  9. import android.view.View
  10. import android.widget.FrameLayout; 
  11. import android.widget.LinearLayout; 
  12.  
  13. import com.stx.xhb.meituancategorydemo.adapter.CagegoryViewPagerAdapter; 
  14. import com.stx.xhb.meituancategorydemo.adapter.EntranceAdapter; 
  15. import com.stx.xhb.meituancategorydemo.model.ModelHomeEntrance; 
  16. import com.stx.xhb.meituancategorydemo.utils.ScreenUtil; 
  17. import com.stx.xhb.meituancategorydemo.widget.IndicatorView; 
  18.  
  19. import java.util.ArrayList; 
  20. import java.util.List; 
  21.  
  22. public class MainActivity extends AppCompatActivity { 
  23.     public static final int HOME_ENTRANCE_PAGE_SIZE = 10;//首頁菜單單頁顯示數(shù)量 
  24.     private ViewPager entranceViewPager; 
  25.     private LinearLayout homeEntranceLayout; 
  26.     private List<ModelHomeEntrance> homeEntrances; 
  27.     private IndicatorView entranceIndicatorView; 
  28.  
  29.     @Override 
  30.     protected void onCreate(Bundle savedInstanceState) { 
  31.         super.onCreate(savedInstanceState); 
  32.         setContentView(R.layout.activity_main); 
  33.         initData(); 
  34.         initView(); 
  35.         init(); 
  36.     } 
  37.  
  38.  
  39.     private void initView() { 
  40.         homeEntranceLayout = (LinearLayout) findViewById(R.id.home_entrance); 
  41.         entranceViewPager = (ViewPager) findViewById(R.id.main_home_entrance_vp); 
  42.         entranceIndicatorView = (IndicatorView) findViewById(R.id.main_home_entrance_indicator); 
  43.     } 
  44.  
  45.  
  46.     private void initData() { 
  47.         homeEntrances = new ArrayList<>(); 
  48.         homeEntrances.add(new ModelHomeEntrance("美食", R.mipmap.ic_category_0)); 
  49.         homeEntrances.add(new ModelHomeEntrance("電影", R.mipmap.ic_category_1)); 
  50.         homeEntrances.add(new ModelHomeEntrance("酒店住宿", R.mipmap.ic_category_2)); 
  51.         homeEntrances.add(new ModelHomeEntrance("生活服務", R.mipmap.ic_category_3)); 
  52.         homeEntrances.add(new ModelHomeEntrance("KTV", R.mipmap.ic_category_4)); 
  53.         homeEntrances.add(new ModelHomeEntrance("旅游", R.mipmap.ic_category_5)); 
  54.         homeEntrances.add(new ModelHomeEntrance("學習培訓", R.mipmap.ic_category_6)); 
  55.         homeEntrances.add(new ModelHomeEntrance("汽車服務", R.mipmap.ic_category_7)); 
  56.         homeEntrances.add(new ModelHomeEntrance("攝影寫真", R.mipmap.ic_category_8)); 
  57.         homeEntrances.add(new ModelHomeEntrance("休閑娛樂", R.mipmap.ic_category_10)); 
  58.         homeEntrances.add(new ModelHomeEntrance("麗人", R.mipmap.ic_category_11)); 
  59.         homeEntrances.add(new ModelHomeEntrance("運動健身", R.mipmap.ic_category_12)); 
  60.         homeEntrances.add(new ModelHomeEntrance("大保健", R.mipmap.ic_category_13)); 
  61.         homeEntrances.add(new ModelHomeEntrance("團購", R.mipmap.ic_category_14)); 
  62.         homeEntrances.add(new ModelHomeEntrance("景點", R.mipmap.ic_category_16)); 
  63.         homeEntrances.add(new ModelHomeEntrance("全部分類", R.mipmap.ic_category_15)); 
  64.     } 
  65.  
  66.     private void init() { 
  67.         LinearLayout.LayoutParams layoutParams12 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) ((float) ScreenUtil.getScreenWidth() / 2.0f)); 
  68.  
  69.         //首頁菜單分頁 
  70.         FrameLayout.LayoutParams entrancelayoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, (int) ((float) ScreenUtil.getScreenWidth() / 2.0f + 70)); 
  71.         homeEntranceLayout.setLayoutParams(entrancelayoutParams); 
  72.         entranceViewPager.setLayoutParams(layoutParams12); 
  73.         LayoutInflater inflater = LayoutInflater.from(this); 
  74.         //將RecyclerView放至ViewPager中: 
  75.         int pageSize = HOME_ENTRANCE_PAGE_SIZE; 
  76.         //一共的頁數(shù)等于 總數(shù)/每頁數(shù)量,并取整。 
  77.         int pageCount = (int) Math.ceil(homeEntrances.size() * 1.0 / pageSize); 
  78.         List<View> viewList = new ArrayList<View>(); 
  79.         for (int index = 0; index < pageCount; index++) { 
  80.             //每個頁面都是inflate出一個新實例 
  81.             RecyclerView recyclerView = (RecyclerView) inflater.inflate(R.layout.item_home_entrance_vp, entranceViewPager, false); 
  82.             recyclerView.setLayoutParams(layoutParams12); 
  83.             recyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this, 5)); 
  84.             EntranceAdapter entranceAdapter = new EntranceAdapter(MainActivity.this, homeEntrances, index, HOME_ENTRANCE_PAGE_SIZE); 
  85.             recyclerView.setAdapter(entranceAdapter); 
  86.             viewList.add(recyclerView); 
  87.         } 
  88.         CagegoryViewPagerAdapter adapter = new CagegoryViewPagerAdapter(viewList); 
  89.         entranceViewPager.setAdapter(adapter); 
  90.         entranceIndicatorView.setIndicatorCount(entranceViewPager.getAdapter().getCount()); 
  91.         entranceIndicatorView.setCurrentIndicator(entranceViewPager.getCurrentItem()); 
  92.         entranceViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
  93.             @Override 
  94.             public void onPageSelected(int position) { 
  95.                 entranceIndicatorView.setCurrentIndicator(position); 
  96.             } 
  97.         }); 
  98.     } 

以上就是實現(xiàn)首頁分頁菜單效果的主要實現(xiàn)代碼,這種分頁菜單效果在我們的應用中也比較常見,說不定啥時候公司產(chǎn)品汪就拿手機過來讓你照著美團之類實現(xiàn)這種效果。

 

責任編輯:未麗燕 來源: 安卓巴士
相關推薦

2015-11-13 11:27:54

2015-03-31 18:19:37

餓了么動畫效果

2023-07-13 09:16:47

循環(huán)隊列指針front?

2017-12-05 15:03:45

人工智能餓了么大數(shù)據(jù)

2018-01-03 09:57:19

異地雙活數(shù)據(jù)庫

2022-02-14 16:08:15

開源項目線程池動態(tài)可監(jiān)控

2017-07-21 14:48:47

AI物流O2O

2025-03-18 08:30:00

Spring開發(fā)java

2021-10-24 06:49:08

線程池中間件開源

2022-01-11 15:35:22

數(shù)字人民幣子錢包區(qū)塊鏈

2009-10-28 09:19:13

Eclipse 3.5項目導航

2025-01-09 10:54:27

2017-10-27 15:44:24

餓了么張龍前端基礎設施

2018-11-29 09:36:56

大數(shù)據(jù)調度系統(tǒng)

2024-05-16 17:58:30

線程任務線程通訊線程池

2015-11-16 16:00:21

2016-04-01 18:25:21

中國科技網(wǎng)

2016-08-26 22:36:18

大數(shù)據(jù)

2020-07-06 08:40:36

阿里餓了么思考

2017-06-12 09:13:02

餓了么技術運營運維
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美成人影院 | 亚洲激情av| 日本网站免费在线观看 | 欧美一区二区三区免费电影 | 一区二区在线免费观看 | 青青久久久 | 成人国产精品视频 | 日韩五月天 | 青娱乐自拍 | 麻豆国产精品777777在线 | 亚洲一区二区三区四区五区中文 | 日韩三级在线观看 | 亚洲精品一区二区三区四区高清 | 亚洲国产情侣自拍 | 超碰av人人| 亚州精品天堂中文字幕 | 亚洲精品不卡 | 国产一区高清 | 国产精品成人品 | 亚洲国产91 | 久久99深爱久久99精品 | 91精品久久久久久久久 | 天天玩天天操天天干 | 国产精品国产成人国产三级 | 瑟瑟视频在线看 | 九九热在线免费视频 | 久久久久久久一区二区三区 | 综合久久一区 | 精品久久久久一区二区国产 | av午夜电影 | 亚洲一区在线日韩在线深爱 | 国产美女在线精品免费 | 日韩精品 | 亚洲xx在线| 欧美日韩精品久久久免费观看 | 欧美日韩国产精品一区二区 | 国产综合网站 | 欧美精品在线一区二区三区 | 青青久久久 | 精品国产精品国产偷麻豆 | 久久久久亚洲av毛片大全 |