recycleview實(shí)現(xiàn)拼多多首頁(yè)水平滑動(dòng)效果
本文實(shí)例為大家分享了recycleview實(shí)現(xiàn)拼多多首頁(yè)水平滑動(dòng)效果的具體代碼,供大家參考,具體內(nèi)容如下
1.說明 本例子模仿拼多多首頁(yè)的水平菜單,原本計(jì)劃用viewpager實(shí)現(xiàn),但是太麻煩,不合適,嘗試用recycleview實(shí)現(xiàn),親測(cè)可運(yùn)行,自定義支持各種樣式效果,高度擴(kuò)展
2.效果圖:
3.下載地址
4.首頁(yè) 貼一下核心代碼 需要源碼的請(qǐng)自行下載
/* * Copyright 2017 GcsSloop * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Last modified 2017-09-18 23:47:01 * * GitHub: https://github.com/GcsSloop * WeiBo: http://weibo.com/GcsSloop * WebSite: http://www.gcssloop.com */ package com.example.mepositry; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.RelativeLayout; import java.util.ArrayList; import java.util.List; public class TwoActivity extends AppCompatActivity implements PagerGridLayoutManager .PageListener { private int mRows = 2; //設(shè)置行數(shù) private int mColumns = 4; //設(shè)置列數(shù) private RecyclerView mRecyclerView; private MyAdapter2 mAdapter; private PagerGridLayoutManager mLayoutManager; private RelativeLayout lineParent; private int mTotal = 0; private int mCurrent = 0; private View lineChild; private String[] names = {"多多果園","九塊九特賣","多多愛消除","天天領(lǐng)現(xiàn)金" ,"行家?guī)湍氵x","限時(shí)秒殺","斷碼清倉(cāng)","跟著好評(píng)買" ,"充值中心","醫(yī)藥館","簽到","多多賺大錢" ,"砍價(jià)免費(fèi)拿","多多精靈","省錢月卡","現(xiàn)金大轉(zhuǎn)盤" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_two); lineParent = findViewById(R.id.rl_line_parent); lineChild = findViewById(R.id.view_line_child); mLayoutManager = new PagerGridLayoutManager(mRows, mColumns, PagerGridLayoutManager .HORIZONTAL); // 系統(tǒng)帶的 RecyclerView,無需自定義 mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); // 水平分頁(yè)布局管理器 mLayoutManager.setPageListener(this); // 設(shè)置頁(yè)面變化監(jiān)聽器 mRecyclerView.setLayoutManager(mLayoutManager); // 如果需要查看調(diào)試日志可以設(shè)置為true,一般情況忽略即可 PagerConfig.setShowLog(true); initData(); } private void initData() { List<String> list = new ArrayList<>(); for (int i = 0; i < 16; i++) { list.add(names[i]); } // mAdapter.refreshDataList(list); // 使用原生的 Adapter 即可 mAdapter = new MyAdapter2(TwoActivity.this, list); mRecyclerView.setAdapter(mAdapter); } @Override public void onPageSizeChanged(int pageSize) { mTotal = pageSize; Log.e("TAG", "總頁(yè)數(shù) = " + pageSize); } @Override public void onPageSelect(int pageIndex, int pageSize) { mCurrent = pageIndex; Log.e("TAG", "選中頁(yè)碼 = " + pageIndex + "\t" + pageSize); //計(jì)算滾動(dòng)條寬度 float proportion = (float) ((pageIndex + 1) / pageSize); float transMaxRange = lineParent.getWidth() - lineChild.getWidth(); //設(shè)置滾動(dòng)條移動(dòng) lineChild.setTranslationX(transMaxRange * proportion); } }
5.適配器
/** * Copyright 2017 GcsSloop * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Last modified 2017-09-18 23:47:01 * * GitHub: https://github.com/GcsSloop * WeiBo: http://weibo.com/GcsSloop * WebSite: http://www.gcssloop.com **/ package com.example.mepositry; import android.annotation.SuppressLint; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class MyAdapter2 extends RecyclerView.Adapter<BaseRecyclerViewHolder> { private List<String> mDataList = new ArrayList<>(); private Context context; public MyAdapter2(Context mContext, List<String> list) { this.context=mContext; this.mDataList = list; } @Override public BaseRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.layout_item2, parent, false); return new BaseRecyclerViewHolder(view); } @SuppressLint("SetTextI18n") @Override public void onBindViewHolder(BaseRecyclerViewHolder holder, final int position) { TextView name = holder.findBindItemView(R.id.tv_title); name.setText("id:"+position+mDataList.get(position)); //抽象方法 name.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e("TAG", "holder.itemView:" + position); } }); } @Override public int getItemCount() { return mDataList.size(); } /* @Override protected int setupItemLayoutId() { return ; } @Override protected void findBindView(int position, BaseRecyclerViewHolder holder) { String data = mDataList.get(position); TextView name = holder.findBindItemView(R.id.tv_title); name.setText(data); }*/ }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android編程實(shí)現(xiàn)應(yīng)用獲取包名、版本號(hào)、權(quán)限等信息的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)應(yīng)用獲取包名、版本號(hào)、權(quán)限等信息的方法,涉及Android針對(duì)應(yīng)用相關(guān)信息的獲取操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-02-02Android Flutter實(shí)現(xiàn)興趣標(biāo)簽選擇功能
我們?cè)谑状问褂脙?nèi)容類 App 的時(shí)候,不少都會(huì)讓我們選擇個(gè)人偏好,通過這些標(biāo)簽選擇可以預(yù)先知道用戶的偏好信息。我們本篇就來看看 Flutter 如何實(shí)現(xiàn)興趣標(biāo)簽的選擇,需要的可以參考一下2022-11-11Android自定義ProgressBar實(shí)現(xiàn)漂亮的進(jìn)度提示框
這篇文章主要為大家詳細(xì)介紹了Android自定義ProgressBar實(shí)現(xiàn)漂亮的進(jìn)度提示框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06使用ViewPager實(shí)現(xiàn)左右循環(huán)滑動(dòng)及滑動(dòng)跳轉(zhuǎn)
今天實(shí)現(xiàn)了左右滑動(dòng),至于在最后一頁(yè)滑動(dòng)跳轉(zhuǎn),這個(gè)也做了但是效果不是太好,也希望有實(shí)現(xiàn)的朋友能夠分享下2013-01-01Android中CountDownTimer 實(shí)現(xiàn)倒計(jì)時(shí)功能
本篇文章主要介紹了Android中CountDownTimer 實(shí)現(xiàn)倒計(jì)時(shí)功能,CountDownTimer 是android 自帶的一個(gè)倒計(jì)時(shí)類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Android設(shè)置鈴聲實(shí)現(xiàn)代碼
這篇文章主要介紹了Android設(shè)置鈴聲實(shí)現(xiàn)代碼,以實(shí)例形式分析了Android中鈴聲設(shè)置的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-10-10Android如何優(yōu)雅的處理重復(fù)點(diǎn)擊
這篇文章主要介紹了Android如何優(yōu)雅的處理重復(fù)點(diǎn)擊,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下2021-03-03Android自定義View播放Gif動(dòng)畫的示例
本篇文章主要介紹了Android自定義View播放Gif動(dòng)畫的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10Flutter 底部彈窗如何實(shí)現(xiàn)多項(xiàng)選擇
在Flutter中提供了一個(gè)showModelBottomSheet方法用于彈出底部彈窗,本篇基于這個(gè)方法介紹實(shí)現(xiàn)底部彈窗多選的思路和方式。2021-06-06