RecyclerView下拉重新整理 上拉載入 原理Demo
RecycleView作為Android5.0谷歌對ListView的升級版,其強大之處是:比ListView更為輕量,使用得當的話,完全可以替代ListView/GridView。本節主要說明新增重新整理頭的原理。首先我們先來熟悉一下RecycleView的簡單使用吧。
recycleView的用法:
1.因為RecycleView在V7包裡面有引入,所以我們要匯入正確的v7包(字尾帶有recycle的v7包);
//設定佈局管理器
rvMain.setLayoutManager(new LinearLayoutManager(this));
//設定adapter
rvMain.setAdapter(new HomeAdapter());
//設定Item增加、移除動畫
rvMain.setItemAnimator(new DefaultItemAnimator());
//新增分割線
rvMain.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
2.該分割線是系統預設的,你可以在theme.xml中找到該屬性的使用情況
注意:這裡的佈局管理器有三種,
rvMain.setLayoutManager(new LinearLayoutManager(this)); //rvMain.setLayoutManager(new GridLayoutManager(this,4)); //rvMain.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
大家可以分別設定一下看看效果,自己去嘗試一下總比我在這裡演示要我,問題也不難。簡單繁瑣的事情我這裡就略過了。
但是我要告訴大家的是如果你僅僅是改變佈局管理器而不去改寫分割線的話效果是明顯不美觀的。大家可以參考鴻洋大神重寫分割線
的博文,很詳細。
recycleViewAdapter的方法概要:
玩過Android開發的小夥伴都應該知道ListView這玩意吧,但是到了RecyclerView這裡好像就不像ListView一樣提供一個
addHeaderView的方法。那麼我們如何實現這個效果呢?
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (TYPE_REFRESH_HEADER==viewType){ return new LViewHolder(mRefreshHeader.getHeaderView()); }else{ return new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_rvmain, parent, false)); } } @Override public void onBindViewHolder( RecyclerView.ViewHolder holder,int position) { if (!isRefreshHeader(position)){ ((MyViewHolder)holder).tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, String.valueOf("aa"),Toast.LENGTH_SHORT).show(); Intent intent = new Intent(mContext ,CoordinatorActivity.class); mContext.startActivity(intent); } }); ((MyViewHolder)holder).tv.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Toast.makeText(mContext, String.valueOf("aa")+"---LONG",Toast.LENGTH_SHORT).show(); return true; } }); } } @Override public int getItemCount() { return 20; } @Override public int getItemViewType(int position) { if (isRefreshHeader(position)) { return TYPE_REFRESH_HEADER; } return TYPE_NORMAL; }
public interface IRefreshHeader { int STATE_NORMAL = 0; int STATE_RELEASE_TO_REFRESH = 1; int STATE_REFRESHING = 2; int STATE_DONE = 3; void onReset(); /** * 下拉移動 */ void onMove(float offSet, float sumOffSet); /** * 處於可以重新整理的狀態,已經過了指定距離 */ void onPrepare(); /** * 下拉鬆開 */ boolean onRelease(); /** * 正在重新整理 */ void onRefreshing(); /** * 下拉重新整理完成 */ void refreshComplete(); /** * 獲取HeaderView */ View getHeaderView(); /** * 獲取Header的顯示高度 */ int getVisibleHeight(); }
@Override public boolean onTouchEvent(MotionEvent e) { if (mLastY == -1) { mLastY = e.getRawY(); } int action =e.getAction(); switch (action){ case MotionEvent.ACTION_DOWN: mLastY = e.getRawY(); sumOffSet = 0; break; case MotionEvent.ACTION_MOVE: final float deltaY = (e.getRawY() - mLastY) / DRAG_RATE; mLastY = e.getRawY(); sumOffSet += deltaY;
//動態設定第一個Item的高度,即重新整理頭 mRefreshHeader.onMove(deltaY, sumOffSet); Log.v("ACTION_MOVE","-------------------"+deltaY); if (mRefreshHeader.getVisibleHeight() > 0 && mRefreshing) { return false; } break; // case MotionEvent.ACTION_UP: // break; // case MotionEvent.ACTION_CANCEL: // break; default://當滑動鬆開時,重新整理頭滑動到重新整理狀態 if (mRefreshHeader.onRelease()) { if (mRefreshListener != null) { mFootView.setVisibility(GONE); mRefreshing = true;
//重新整理狀態的回撥,載入資料的過程
mRefreshListener.onRefresh(); } } } return super.onTouchEvent(e); }3.主頁面主要邏輯
public void BasicUse(){ //設定佈局管理器 rvMain.setLayoutManager(new LinearLayoutManager(this)); //rvMain.setLayoutManager(new GridLayoutManager(this,4)); //rvMain.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL)); //設定adapter rvMain.setAdapter(new LRecyclerViewAdapter(MainActivity.this)); //設定Item增加、移除動畫 rvMain.setItemAnimator(new DefaultItemAnimator()); //新增分割線 // rvMain.addItemDecoration(new DividerItemDecoration( // this, DividerItemDecoration.VERTICAL)); rvMain.addItemDecoration(new DividerGridItemDecoration( MainActivity.this)); rvMain.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { new Handler().postDelayed(new Runnable(){ public void run() { //這裡作網路資料請求提供的方法,但我沒有處理 //當資料重新整理後我們呼叫下面的方法把正在重新整理狀態下的重新整理頭的高度和狀態改變 rvMain.refreshComplete(10); } }, 1200); } }); }上拉載入更多原理:
@Override public void onScrollStateChanged(int state) { super.onScrollStateChanged(state); currentScrollState = state; Log.d("------------", "onScrollStateChanged: onScrollStateChanged--------------"+state); if (mLScrollListener != null) { mLScrollListener.onScrollStateChanged(state); } if (mLoadMoreListener != null && mLoadMoreEnabled) { if (currentScrollState == RecyclerView.SCROLL_STATE_IDLE) { RecyclerView.LayoutManager layoutManager = getLayoutManager(); int visibleItemCount = layoutManager.getChildCount(); int totalItemCount = layoutManager.getItemCount(); if (visibleItemCount > 0 && lastVisibleItemPosition == totalItemCount - 1 && totalItemCount > visibleItemCount && !mRefreshing) { mFootView.setVisibility(View.VISIBLE); if (mLoadingData) { return; } else { mLoadingData = true; mLoadMoreFooter.onLoading(); mLoadMoreListener.onLoadMore(); }3.dapter的改寫
@Override public int getItemViewType(int position) { // if (isRefreshHeader(position)) { // return TYPE_REFRESH_HEADER; // } // return TYPE_NORMAL; // int adjPosition = position - (getHeaderViewsCount() + 1); if (isRefreshHeader(position)) { return TYPE_REFRESH_HEADER; } // if (isHeader(position)) { // position = position - 1; // return mHeaderTypes.get(position); // } if (isFooter(position)) { return TYPE_FOOTER_VIEW; } // int adapterCount; // if (mInnerAdapter != null) { // adapterCount = mInnerAdapter.getItemCount(); // if (adjPosition < adapterCount) { // return mInnerAdapter.getItemViewType(adjPosition); // } // } return TYPE_NORMAL; }
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (TYPE_REFRESH_HEADER==viewType){ return new LViewHolder(mRefreshHeader.getHeaderView()); } else if (viewType == TYPE_FOOTER_VIEW) { return new LViewHolder(mFooterViews.get(0)); } else { return new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_rvmain, parent, false)); }3.主頁面邏輯
rvMain.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore() { new Handler().postDelayed(new Runnable() { public void run() { //這裡作網路資料請求提供的方法,但我沒有處理 //當資料重新整理後我們呼叫下面的方法把正在重新整理狀態下的重新整理頭的高度和狀態改變 rvMain.setNoMore(true); } }, 1200); } });這裡只是簡單的介紹了RecycleView下拉重新整理和上拉載入的基本原理,離真實專案開發用到還有很長一段距離要走呢。接下來我會整理一下這個Demo
相關文章
- recyclerView的側拉效果。上拉載入。下拉重新整理,點選事件等等View事件
- 上拉重新整理,下拉載入
- Flutter——下拉重新整理,上拉載入Flutter
- 給RecyclerView擴充套件下拉重新整理上拉載入View套件
- flutter - listView 下拉重新整理 上拉載入FlutterView
- 上拉載入下拉重新整理瞭解下
- Flutter 實現下拉重新整理&上拉載入Flutter
- Flutter listview下拉重新整理 上拉載入更多FlutterView
- UITableView:下拉重新整理和上拉載入更多UIView
- H5下拉重新整理和上拉載入實現原理淺析H5
- Flutter下拉重新整理,上拉載入更多資料Flutter
- ListView下拉重新整理,上拉自動載入更多View
- uni-app | 上拉載入和下拉重新整理探索APP
- Flutter ListView封裝,下拉重新整理、上拉載入更多FlutterView封裝
- 下拉重新整理,上拉載入外掛mescroll原始碼分析原始碼
- vue 實現上拉載入下拉重新整理(思路賊清晰)Vue
- Flutter 下拉重新整理上拉載入更多Flutter
- 搭建自己的直播平臺,RecycleView下拉重新整理,上拉載入View
- Flutter入門進階之旅(十五)ListView下拉重新整理&上拉載入更多FlutterView
- 移動端用下拉重新整理的方式實現上拉載入
- 【微信小程式】scroll-view 的上拉載入和下拉重新整理微信小程式View
- 淺談微信小程式中的下拉重新整理和上拉載入微信小程式
- 分享輪子-flutter下拉重新整理上拉載入Flutter
- 為RecyclerView新增分頁載入(上拉載入更多)功能View
- 自己動手寫RecyclerView的上拉載入View
- flutter - RefreshIndicator實現下拉重新整理、上拉載入 | 掘金技術徵文FlutterIndicator
- 微信開發之下拉重新整理上拉載入更多
- Swift iOS : 上拉重新整理或者下拉重新整理SwiftiOS
- vue-better-scroll 一個vue的上拉載入下拉重新整理外掛Vue
- 入門微信小程式(含實戰) [第九篇] -- 下拉重新整理和上拉載入微信小程式
- Movable-view實現列表的下拉重新整理上拉載入View
- 移動端上拉載入和下拉重新整理的vue外掛Vue
- React Native——自定義下拉重新整理上拉載入的列表React Native
- pulltorefreshRecylerView下拉重新整理上拉載入,支援自能預載入,可定製的底部View
- vue移動端下拉重新整理和上拉載入元件,體積小執行快Vue元件
- 實現RecyclerView下拉重新整理View
- Flutter之封裝一個下拉重新整理上拉載入的listviewFlutter封裝View
- 下拉重新整理--載入更多