自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android快速實(shí)現(xiàn)美團(tuán)、餓了么首頁(yè)分頁(yè)導(dǎo)航菜單功能

移動(dòng)開(kāi)發(fā) Android
前段時(shí)間公司移動(dòng)端App新增一個(gè)模塊,類(lèi)似美團(tuán)團(tuán)購(gòu)的功能,首頁(yè)有個(gè)類(lèi)似美團(tuán)的分頁(yè)菜單的功能,用過(guò)美團(tuán)和餓了么的app的童鞋應(yīng)該清楚這一功能。首頁(yè)菜單可以分頁(yè)切換,類(lèi)似我們的banner廣告切換效果,只不過(guò)只能手動(dòng)切換。

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

Android快速實(shí)現(xiàn)美團(tuán)、餓了么首頁(yè)分頁(yè)導(dǎo)航菜單功能

Android快速實(shí)現(xiàn)美團(tuán)、餓了么首頁(yè)分頁(yè)導(dǎo)航菜單功能

Android快速實(shí)現(xiàn)美團(tuán)、餓了么首頁(yè)分頁(yè)導(dǎo)航菜單功能

首頁(yè)布局文件,分頁(yè)指示器是單獨(dú)封裝的一個(gè)控件,后面會(huì)把代碼貼出來(lái)

  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"/> 

接下來(lái)就是RecyclerView的菜單項(xiàng)的布局文件 

  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)建好了,接下來(lái)我們一起來(lái)看看里面的具體實(shí)現(xiàn)代碼了。由于我們的菜單項(xiàng)有一個(gè)icon和名稱(chēng)name,為了方便管理,我們可以創(chuàng)建一個(gè)菜單項(xiàng)實(shí)體類(lèi)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:菜單項(xiàng)實(shí)體類(lèi) 
  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.  

由于我們分頁(yè)效果是以ViewPager實(shí)現(xiàn)的,所以我們要?jiǎng)?chuàng)建一個(gè)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:  首頁(yè)分類(lèi)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)建一個(gè)RecyclerView的菜單項(xiàng)列表適配器,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: 首頁(yè)分頁(yè)菜單項(xiàng)列表適配器 
  24.  */ 
  25. public class EntranceAdapter extends RecyclerView.Adapter<EntranceAdapter.EntranceViewHolder> { 
  26.  
  27.     private List<ModelHomeEntrance> mDatas; 
  28.  
  29.     /** 
  30.      * 頁(yè)數(shù)下標(biāo),從0開(kāi)始(通俗講第幾頁(yè)) 
  31.      */ 
  32.     private int mIndex; 
  33.  
  34.     /** 
  35.      * 每頁(yè)顯示最大條目個(gè)數(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ù)時(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 點(diǎn)擊事件處理 
  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的代碼實(shí)現(xiàn)了,我們整體的思路其實(shí)就是需要根據(jù)首頁(yè)菜單項(xiàng)的數(shù)據(jù)源進(jìn)行分頁(yè)顯示,首頁(yè)確定單頁(yè)菜單顯示數(shù)量,總數(shù)除以單頁(yè)顯示數(shù)量取整就是顯示頁(yè)數(shù),我們?cè)俑鶕?jù)頁(yè)數(shù)來(lái)創(chuàng)建RecyclerView將其添加到ViewPager的適配器中,下面就讓我們一起來(lái)看看具體是如何的。 

  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;//首頁(yè)菜單單頁(yè)顯示數(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("生活服務(wù)", 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("學(xué)習(xí)培訓(xùn)", R.mipmap.ic_category_6)); 
  55.         homeEntrances.add(new ModelHomeEntrance("汽車(chē)服務(wù)", R.mipmap.ic_category_7)); 
  56.         homeEntrances.add(new ModelHomeEntrance("攝影寫(xiě)真", R.mipmap.ic_category_8)); 
  57.         homeEntrances.add(new ModelHomeEntrance("休閑娛樂(lè)", R.mipmap.ic_category_10)); 
  58.         homeEntrances.add(new ModelHomeEntrance("麗人", R.mipmap.ic_category_11)); 
  59.         homeEntrances.add(new ModelHomeEntrance("運(yùn)動(dòng)健身", R.mipmap.ic_category_12)); 
  60.         homeEntrances.add(new ModelHomeEntrance("大保健", R.mipmap.ic_category_13)); 
  61.         homeEntrances.add(new ModelHomeEntrance("團(tuán)購(gòu)", R.mipmap.ic_category_14)); 
  62.         homeEntrances.add(new ModelHomeEntrance("景點(diǎn)", R.mipmap.ic_category_16)); 
  63.         homeEntrances.add(new ModelHomeEntrance("全部分類(lèi)", 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.         //首頁(yè)菜單分頁(yè) 
  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.         //一共的頁(yè)數(shù)等于 總數(shù)/每頁(yè)數(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.             //每個(gè)頁(yè)面都是inflate出一個(gè)新實(shí)例 
  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.     } 

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

 

責(zé)任編輯:未麗燕 來(lái)源: 安卓巴士
相關(guān)推薦

2015-03-31 18:19:37

餓了么動(dòng)畫(huà)效果

2015-11-13 11:27:54

2023-07-13 09:16:47

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

2017-12-05 15:03:45

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

2018-01-03 09:57:19

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

2017-07-21 14:48:47

AI物流O2O

2025-03-18 08:30:00

Spring開(kāi)發(fā)java

2022-02-14 16:08:15

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

2021-10-24 06:49:08

線程池中間件開(kāi)源

2009-10-28 09:19:13

Eclipse 3.5項(xiàng)目導(dǎo)航

2022-01-11 15:35:22

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

2018-11-29 09:36:56

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

2025-01-09 10:54:27

2017-10-27 15:44:24

餓了么張龍前端基礎(chǔ)設(shè)施

2024-05-16 17:58:30

線程任務(wù)線程通訊線程池

2015-11-16 16:00:21

2010-09-13 14:17:42

CSS縱向?qū)Ш讲藛?/a>

2016-08-26 22:36:18

大數(shù)據(jù)

2020-07-06 08:40:36

阿里餓了么思考

2016-04-01 18:25:21

中國(guó)科技網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)