SwipeRefreshLayout+RecyclerView實現下拉重新整理上拉載入功能
Android Studio 的gradle中新增如下依賴,SwipeRefreshLayout在 support V4 包下,RecyclerView在V7包下,由於V7包內包涵了V4,所以就不需要新增V4的依賴了。
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.android.support:recyclerview-v7:23.0.0'
實現繼承自RecyclerView.Adapter<>的介面卡, 實現上拉載入功能,在RecyclerView的底部新增一個footer,(根據ViewType的型別判斷是新增Item還是Footer),需要重寫的三個方法:
①onCreateViewHolder()
這個方法主要為每個Item inflater出一個View,但是該方法返回的是一個ViewHolder。該方法把View直接封裝在ViewHolder中,然後我們面向的是ViewHolder這個例項,當然這個ViewHolder需要我們自己去編寫。直接省去了當初的convertView.setTag(holder)和convertView.getTag()這些繁瑣的步驟。
②onBindViewHolder()
這個方法主要用於適配渲染資料到View中。方法提供給你了一個viewHolder,而不是原來的convertView。
③getItemCount()
這個方法就類似於BaseAdapter的getCount方法了,即總共有多少個條目。
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public enum LoadStatus{
CLICK_LOAD_MORE,//上拉載入更多
LOADING_MORE//正在載入更多
}
private LoadStatus mLoadStatus = LoadStatus.CLICK_LOAD_MORE;//上拉載入的狀態
private static final int VIEW_TYPE_FOOTER = 0;
private static final int VIEW_TYPE_ITEM = 1;
private List<String> mList;
private Context mContext;
public MyAdapter(Context context, List<String> list) {
mContext = context;
mList = list;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == VIEW_TYPE_FOOTER) {
return onCreateFooterViewHolder(parent, viewType);
} else if (viewType == VIEW_TYPE_ITEM) {
return onCreateItemViewHolder(parent, viewType);
}
return null;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case VIEW_TYPE_ITEM:
onBindItemViewHolder(holder, position);
break;
case VIEW_TYPE_FOOTER:
onBindFooterViewHolder(holder, position, mLoadStatus);
break;
default:
break;
}
}
public RecyclerView.ViewHolder onCreateFooterViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.footer_layout,parent,false);
return new FooterViewHolder(view);
}
public RecyclerView.ViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) {
View view =LayoutInflater.from(mContext).inflate(R.layout.item_layout,parent,false);
return new ItemViewHolder(view);
}
public void onBindFooterViewHolder(RecyclerView.ViewHolder holder, int poition, LoadStatus loadStatus) {
FooterViewHolder viewHolder = (FooterViewHolder) holder;
switch (loadStatus) {
case CLICK_LOAD_MORE:
viewHolder.mLoadingLayout.setVisibility(View.GONE);
viewHolder.mClickLoad.setVisibility(View.VISIBLE);
break;
case LOADING_MORE:
viewHolder.mLoadingLayout.setVisibility(View.VISIBLE);
viewHolder.mClickLoad.setVisibility(View.GONE);
break;
}
}
public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
ItemViewHolder viewHolder = (ItemViewHolder) holder;
viewHolder.mTextView.setText(getItem(position));
}
@Override
public int getItemCount() {
return mList.size() + 1;
}
public void refresh(){
notifyDataSetChanged();
}
public String getItem(int position) {
return mList.get(position);
}
public void addAll(List<String> list) {
this.mList.addAll(list);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if (position + 1 == getItemCount()) {//最後一條為FooterView
return VIEW_TYPE_FOOTER;
}
return VIEW_TYPE_ITEM;
}
public void reSetData(List<String> list) {
this.mList = list;
notifyDataSetChanged();
}
public void setLoadStatus(LoadStatus loadStatus) {
this.mLoadStatus = loadStatus;
}
}
class FooterViewHolder extends RecyclerView.ViewHolder{
public LinearLayout mLoadingLayout;
public TextView mClickLoad;
public FooterViewHolder(View itemView) {
super(itemView);
mLoadingLayout=(LinearLayout) itemView.findViewById(R.id.loading);
mClickLoad=(TextView) itemView.findViewById(R.id.click_load_txt);
/* mClickLoad.setOnClickListener(new View.OnClickListener() {
//新增點選載入更多監聽
@Override
public void onClick(View view) {
loadMore();
}
});*/
}
}
class ItemViewHolder extends RecyclerView.ViewHolder{
public TextView mTextView;
public ItemViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.textView);
}
}
footer的layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_horizontal"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/loading"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="正在載入..."/>
</LinearLayout>
<TextView
android:id="@+id/click_load_txt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="點選載入更多"
android:visibility="gone"/>
</RelativeLayout>
Item的layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:gravity="center"
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
activity_main
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.yzppp.recycle.MainActivity">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
MainActivity的實現,下拉重新整理通過SwipeRefreshLayout.OnRefreshListener()
介面來實現。
public class MainActivity extends Activity {
private RecyclerView mRecyclerView;
private SwipeRefreshLayout mSwipeRefreshLayout;
private MyAdapter mAdapter;
private int mLastVisibleItemPosition=0;
private LinearLayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView= (RecyclerView) findViewById(R.id.recyclerView);
mSwipeRefreshLayout= (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
mLayoutManager=new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mAdapter=new MyAdapter(this,getData("init"));
mRecyclerView.setAdapter(mAdapter);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener(){
@Override
public void onRefresh() {
new Thread(){
@Override
public void run() {
try{
Thread.sleep(3000);
final List<String> list=getData("refresh");
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.reSetData(list);
mSwipeRefreshLayout.setRefreshing(false);
}
});
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}.start();
}
});
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override//滾動狀態變化時回撥
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// mLastVisibleItemPosition=mLayoutManager.findLastVisibleItemPosition();
//滑動停止並且底部不可滾動(即滑動到底部) 載入更多
if(newState==RecyclerView.SCROLL_STATE_IDLE&&!(ViewCompat.canScrollVertically(recyclerView,1))
){
loadMore();
}
}
@Override//滾動時回撥
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
}
public void loadMore(){
mAdapter.setLoadStatus(MyAdapter.LoadStatus.LOADING_MORE);
mAdapter.refresh();
new Thread(){
@Override
public void run() {
try{
Thread.sleep(3000);
final List<String> list=getData("load more");
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.addAll(list);
mAdapter.setLoadStatus(MyAdapter.LoadStatus.CLICK_LOAD_MORE);
}
});
}catch (InterruptedException e){
e.printStackTrace();
};
}
}.start();
}
public List<String> getData(String flag){
int idx=1;
if(mAdapter!=null){
idx=mAdapter.getItemCount();
}
List<String> list=new ArrayList<>(10);
for (int i=0;i<10;i++){
list.add(flag+":"+(idx+i));
}
return list;
}
}
相關推薦
使用SwipeRefreshLayout和RecyclerView實現下拉重新整理上拉載入更多
效果圖: 檔案目錄 佈局檔案 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/
SwipeRefreshLayout+RecyclerView實現下拉重新整理上拉載入功能
Android Studio 的gradle中新增如下依賴,SwipeRefreshLayout在 support V4 包下,RecyclerView在V7包下,由於V7包內包涵了V4,所以就不需要新增V4的依賴了。 compile 'com.and
SwipeRefreshLayout完美實現ListView網路資料上拉載入以及下拉重新整理
最近才有時間將上拉載入與下拉重新整理進行總結,SwipeRefreshLayout是Android -V4包下自帶的一個重新整理控制元件,但是不足的是它只有下拉重新整理的功能,沒有需要的上拉載入功能,所以我自己添加了上拉載入的功能。 一、首先簡單介紹一下SwipeRefre
自定義下拉重新整理上拉載入控制元件(SwipeRefreshLayout + recyclerView)
感覺還可以的star下謝謝! 效果圖:(效果圖迴圈播放後,總感覺有些詭異!, 可能是gif截的點不對, 在手機上看效果正常的) 我就不講程式碼是如何實現的了。說下實現了什麼內容: 支援自動下拉重新整理 //設定自動下拉重新整理,切記要
react native自定義實現下拉重新整理上拉載入
1·定義元件 PageListView.js /** * 上拉重新整理/下拉載入更多 元件 */ import React, { Component } from 'react'; import { Text, View, ListView, FlatList
vue-scroller的使用 實現下拉重新整理 上拉載入初始效果
安裝vue-scroller npm i vue-scroller -D 在main.js中: import VueScroller from 'vue-scroller' Vue.use(VueScroller) &nbs
MUI下拉重新整理上拉載入實現
DOM結構 <div id="refreshContainer" class="mui-content mui-scroll-wrapper"> <div class="hui-media-list mui-scroll"> <u
Android中ListView下拉重新整理上拉載入更多效果實現
在Android開發中,下拉重新整理和上拉載入更多在很多app中都會有用到,下面就是具體的實現的方法。 首先,我們自定義一個RefreshListView來繼承與ListView,下面是程式碼: package com.example.downrefresh; import
banner實現無限輪播+下拉重新整理上拉載入+ 下拉時 listview 和輪播圖一起重新整理
//首先把所需要的依賴包匯入 gson jar包、imageLoader jar包、banner1.4.9jar包、design jar包,,,然後匯入library,新建專案,把library匯入專案中 //新增許可權 <uses-permiss
Android ListView 實現下拉重新整理上拉載入
1.簡介 無疑,在Android開發中,ListView是使用非常頻繁的控制元件之一,ListView提供一個列表的容易,允許我們以列表的形式將資料展示到介面上,但是Google給我們提供的原生ListView的控制元件,雖然在功能上很強大,但是在使用
android 打造真正的下拉重新整理上拉載入recyclerview(三):下拉重新整理上拉載入
前言 在開發過程中,我想了兩種方案。一是使用LinearLayout巢狀頭部、recyclerview、尾部的方式,如下圖: 當recyclerview滑動到頂部時,移動LinearLayout露出頭部; 當recyclerview滑動到底
Android scrollview中巢狀listview實現listview的下拉重新整理上拉載入更多
我們都知道在Android中scrollview和listview都能滑動,如果scrollview巢狀listview會出現一些問題,比如listview不能正常顯示item...但是在一些專案中,一些頁面內容比較多,需要在外面放一個scrollview,裡面還會巢狀li
android 打造真正的下拉重新整理上拉載入recyclerview(一):使用
版本更新資訊 –V1.1.1 修復: PullToLoadRecyclerView中EmptyView失效的問題; 當使用ViewPager時,會出現觸控事件衝突; 優化: 當items不能填滿RecyclerView時,將隱藏載入底部; Pu
快速整合Android實現下拉重新整理上拉載入更多
本文實現一分鐘快速整合BGARefreshLayout下拉重新整理和上拉載入的功能. 這個是簡單單功能的整合方法,詳細BGARefreshLayout請到github中的demo,這只是我簡化版快速整合. 重要的程式碼實現如下: MainActivity類: pub
Android滑動衝突解決方式(下拉重新整理上拉載入更多,適配RecyclerView/ListView/ScrollView)
@Override public boolean judgeIntercept(float curInterceptY, float lastInterceptY, boolean isHeaderShow, boolean isFooterShow, boolean allowLoadM
安卓實現下拉重新整理上拉載入
前言 Android智慧下拉重新整理框架-SmartRefreshLayout 是github 上的一個開源框架,地址https://github.com/scwang90/SmartRefreshLayout 我做的幾個專案用的都是這個框架,挺好用的。
Android自定義控制元件實戰——實現仿IOS下拉重新整理上拉載入 PullToRefreshLayout
下拉重新整理控制元件,網上有很多版本,有自定義Layout佈局的,也有封裝控制元件的,各種實現方式的都有。但是很少有人告訴你具體如何實現的,今天我們就來一步步實現自己封裝的 PullToRefreshLayout 完美的解決下拉重新整理,上拉載入問題。
微信小程式 下拉重新整理/上拉載入更多 (上拉載入更多怎麼實現)
實現原理: 1、下拉重新整理:由於小程式資料是實時渲染的。我們把data{}內的資料清空重新載入即可實現下拉重新整理。 2、上拉載入更多(頁面上拉觸底事件):新獲取的資料追加到data{}內的原
完全自定義RecyclerView下拉重新整理上拉載入
自從谷歌推出SwipeRefreshLayout之後越來越多的部落格都是使用SwipeRefreshLayout來完成下拉重新整理,但是往往產品經理根本不會使用谷歌的樣式.每個公司都有一套自己的下拉樣式這個時候就需要我們完全自定義RecyclerView的下拉重新整理,基本
react-native-page-listview使用方法(自定義FlatList/ListView下拉重新整理,上拉載入更多,方便的實現分頁)
react-native-page-listview 對ListView/FlatList的封裝,可以很方便的分頁載入網路資料,還支援自定義下拉重新整理View和上拉載入更多的View.相容高版本FlatList和低版本ListVIew.元件會根據你使用的re