Android控件十三:SwipeRefreshLayout实现上拉加载和下拉刷新

SwipeRefreshLayout实现上拉加载和下拉刷新

原文:https://www.cnblogs.com/liunanjava/p/5860024.html

实例一:下拉刷新和上拉刷新都用SwipeRefreshLayout自带的进度条(默认上拉刷新没有效果)

代码实现:
layout/activity_main.xml

		<?xml version="1.0" encoding="utf-8"?>
		<LinearLayout 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:orientation="vertical"
			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=".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>

		</LinearLayout>

layout/item_refresh_recylerview.xml

		<?xml version="1.0" encoding="utf-8"?>
		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			xmlns:app="http://schemas.android.com/apk/res-auto"
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:layout_margin="5dp"
			android:background="#6666"
			android:orientation="horizontal">

			<ImageView
				android:layout_width="wrap_content"
				android:layout_height="wrap_content"
				android:src="@mipmap/ic_launcher" />

			<TextView
				android:id="@+id/tvContent"
				android:layout_width="match_parent"
				android:layout_height="wrap_content"
				android:layout_margin="10dp"
				android:text="魂牵梦萦地"
				android:textSize="18sp" />

		</LinearLayout>

com/example/administrator/RefreshAdapter.java

		package com.example.administrator;
		import android.content.Context;
		import android.support.v7.widget.RecyclerView;
		import android.view.LayoutInflater;
		import android.view.View;
		import android.view.ViewGroup;
		import android.widget.TextView;
		import android.widget.Toast;
		import java.util.List;

		public class RefreshAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

			private Context mContext;
			private LayoutInflater mInflater;
			private List<String> mDatas;

			public RefreshAdapter(Context context, List<String> datas) {
				mContext = context;
				mInflater = LayoutInflater.from(context);
				mDatas = datas;
			}

			@Override
			public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
				View itemView = mInflater.inflate(R.layout.item_refresh_recylerview, parent, false);
				return new ItemViewHolder(itemView);
			}

			@Override
			public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
				if(holder instanceof ItemViewHolder){
					ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
					String str = mDatas.get(position);
					itemViewHolder.mTvContent.setText(str);
				}
			}

			@Override
			public int getItemCount() {
				return mDatas.size();
			}

			@Override
			public int getItemViewType(int position) {
				return super.getItemViewType(position);
			}

			public class ItemViewHolder extends RecyclerView.ViewHolder {
				TextView mTvContent;
				public ItemViewHolder(View itemView) {
					super(itemView);
					mTvContent = itemView.findViewById(R.id.tvContent);
					initListener(itemView);
				}

				private void initListener(View itemView) {
					itemView.setOnClickListener(new View.OnClickListener() {
						@Override
						public void onClick(View v) {
							Toast.makeText(mContext, "poistion "+ getAdapterPosition(), Toast.LENGTH_SHORT).show();
						}
					});
				}
			}

			public void AddHeaderItem(List<String> items){
				mDatas.addAll(0,items);
				notifyDataSetChanged();
			}

			public void AddFooterItem(List<String> items){
				mDatas.addAll(items);
				notifyDataSetChanged();
			}
		}

com/example/administrator/MainActivity.java

		package com.example.administrator;
		import android.graphics.Color;
		import android.os.Bundle;
		import android.os.Handler;
		import android.support.v4.widget.SwipeRefreshLayout;
		import android.support.v7.app.AppCompatActivity;
		import android.support.v7.widget.LinearLayoutManager;
		import android.support.v7.widget.RecyclerView;
		import android.view.Window;
		import android.widget.Toast;
		import java.util.ArrayList;
		import java.util.List;

		public class MainActivity extends AppCompatActivity {

			RecyclerView mRecyclerView;
			SwipeRefreshLayout mSwipeRefreshLayout;
			List<String> mDatas = new ArrayList<>();
			private RefreshAdapter mRefreshAdapter;
			private LinearLayoutManager mLinearLayoutManager;

			@Override
			protected void onCreate(Bundle savedInstanceState) {
				super.onCreate(savedInstanceState);
				requestWindowFeature(Window.FEATURE_NO_TITLE);
				setContentView(R.layout.activity_main);
				mRecyclerView = findViewById(R.id.recyclerView);
				mSwipeRefreshLayout = findViewById(R.id.swipeRefreshLayout);
				initView();
				initData();
				initListener();
			}

			private void initView() {
				mSwipeRefreshLayout.setColorSchemeColors(Color.RED,Color.BLUE,Color.GREEN);
			}

			private void initData() {
				for (int i = 0; i < 15; i++) {
					mDatas.add(" Item "+i);
				}
				initRecylerView();
			}

			private void initRecylerView() {
				mRefreshAdapter = new RefreshAdapter(this,mDatas);
				mLinearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
				mRecyclerView.setLayoutManager(mLinearLayoutManager);
				mRecyclerView.setAdapter(mRefreshAdapter);
			}

			private void initListener() {
				initPullRefresh();
				initLoadMoreListener();
			}

			private void initPullRefresh() {
				mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
					@Override
					public void onRefresh() {
						new Handler().postDelayed(new Runnable() {
							@Override
							public void run() {
								List<String> headDatas = new ArrayList<String>();
								for (int i = 20; i <30 ; i++) {
									headDatas.add("Heard Item "+i);
								}
								mRefreshAdapter.AddHeaderItem(headDatas);
								//刷新完成
								mSwipeRefreshLayout.setRefreshing(false);
								Toast.makeText(MainActivity.this, "更新了 "+headDatas.size()+" 条目数据", Toast.LENGTH_SHORT).show();
							}
						}, 3000);
					}
				});
			}

			private void initLoadMoreListener() {
				mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
					int lastVisibleItem ;
					@Override
					public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
						super.onScrollStateChanged(recyclerView, newState);
						//判断RecyclerView的状态 是空闲时,同时,是最后一个可见的ITEM时才加载
						if(newState==RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItem+1==mRefreshAdapter.getItemCount()){
							new Handler().postDelayed(new Runnable() {
								@Override
								public void run() {
									List<String> footerDatas = new ArrayList<String>();
									for (int i = 0; i< 10; i++) {
										footerDatas.add("footer  item" + i);
									}
									mRefreshAdapter.AddFooterItem(footerDatas);
									Toast.makeText(MainActivity.this, "更新了 "+footerDatas.size()+" 条目数据", Toast.LENGTH_SHORT).show();
								}
							}, 3000);
						}
					}

					@Override
					public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
						super.onScrolled(recyclerView, dx, dy);
						LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
						//最后一个可见的ITEM
						lastVisibleItem=layoutManager.findLastVisibleItemPosition();
					}
				});

			}
		}
实例二:下拉刷新用SwipeRefreshLayout自带的进度条,上拉刷新用类似ListView的刷新提示“加载中”等信息。

layout/load_more.xml

		<?xml version="1.0" encoding="utf-8"?>
		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:id="@+id/loadLayout"
			android:padding="10dp"
			android:layout_width="match_parent"
			android:layout_height="wrap_content"

			android:gravity="center"
			android:orientation="vertical">

			<RelativeLayout
				android:layout_width="match_parent"
				android:layout_height="wrap_content"
				android:layout_marginBottom="5dip"
				android:layout_marginTop="5dip"
				android:gravity="center">

				<ProgressBar
					android:id="@+id/pbLoad"
					android:layout_width="20dp"
					android:layout_height="20dp"
					android:layout_centerVertical="true"
					android:indeterminate="false"/>

				<TextView
					android:id="@+id/tvLoadText"
					android:layout_width="wrap_content"
					android:layout_height="wrap_content"
					android:layout_centerInParent="true"
					android:layout_centerVertical="true"
					android:layout_marginLeft="4dip"
					android:layout_toRightOf="@id/pbLoad"
					android:clickable="true"
					android:text="魂牵梦萦 魂牵梦萦 "
					android:textColor="#000000"
					android:textSize="16sp"/>
			</RelativeLayout>

		</LinearLayout>

com/example/administrator/RefreshAdapter.java

		package com.example.administrator;
		import android.content.Context;
		import android.support.v7.widget.RecyclerView;
		import android.view.LayoutInflater;
		import android.view.View;
		import android.view.ViewGroup;
		import android.widget.LinearLayout;
		import android.widget.ProgressBar;
		import android.widget.TextView;
		import android.widget.Toast;
		import java.util.List;

		public class RefreshAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

			private Context mContext;
			private LayoutInflater mInflater;
			private List<String> mDatas;
			private static final int TYPE_ITEM   = 0;
			private static final int TYPE_FOOTER = 1;
			//上拉加载更多
			public static final int PULLUP_LOAD_MORE = 0;
			//正在加载中
			public static final int LOADING_MORE     = 1;
			//没有加载更多 隐藏
			public static final int NO_LOAD_MORE     = 2;
			//上拉加载更多状态-默认为0
			private int mLoadMoreStatus = 0;

			public RefreshAdapter(Context context, List<String> datas) {
				mContext = context;
				mInflater = LayoutInflater.from(context);
				mDatas = datas;
			}

			@Override
			public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
				if (viewType == TYPE_ITEM) {
					View itemView = mInflater.inflate(R.layout.item_refresh_recylerview, parent, false);
					return new ItemViewHolder(itemView);
				} else if (viewType == TYPE_FOOTER) {
					View itemView = mInflater.inflate(R.layout.load_more, parent, false);
					return new FooterViewHolder(itemView);
				}
				return null;
			}

			@Override
			public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
				if (holder instanceof ItemViewHolder) {
					ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
					String str = mDatas.get(position);
					itemViewHolder.mTvContent.setText(str);
				} else if (holder instanceof FooterViewHolder) {
					FooterViewHolder footerViewHolder = (FooterViewHolder) holder;
					switch (mLoadMoreStatus) {
						case PULLUP_LOAD_MORE:
							footerViewHolder.mTvLoadText.setText("上拉加载更多...");
							break;
						case LOADING_MORE:
							footerViewHolder.mTvLoadText.setText("正加载更多...");
							break;
						case NO_LOAD_MORE:
							//隐藏加载更多
							footerViewHolder.mLoadLayout.setVisibility(View.GONE);
							break;
					}
				}
			}

			@Override
			public int getItemCount() {
				//RecyclerView的count设置为数据总条数+ 1(footerView)
				return mDatas.size() + 1;
			}

			@Override
			public int getItemViewType(int position) {

				if (position + 1 == getItemCount()) {
					//最后一个item设置为footerView
					return TYPE_FOOTER;
				} else {
					return TYPE_ITEM;
				}
			}

			public class ItemViewHolder extends RecyclerView.ViewHolder {
				TextView mTvContent;
				public ItemViewHolder(View itemView) {
					super(itemView);
					mTvContent = itemView.findViewById(R.id.tvContent);
					initListener(itemView);
				}

				private void initListener(View itemView) {
					itemView.setOnClickListener(new View.OnClickListener() {
						@Override
						public void onClick(View v) {
							Toast.makeText(mContext, "poistion " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
						}
					});
				}
			}

			public class FooterViewHolder extends RecyclerView.ViewHolder {
				ProgressBar mPbLoad;
				TextView     mTvLoadText;
				LinearLayout mLoadLayout;
				public FooterViewHolder(View itemView) {
					super(itemView);
					mPbLoad = itemView.findViewById(R.id.pbLoad);
					mTvLoadText = itemView.findViewById(R.id.tvLoadText);
					mLoadLayout = itemView.findViewById(R.id.loadLayout);
				}
			}

			public void AddHeaderItem(List<String> items) {
				mDatas.addAll(0, items);
				notifyDataSetChanged();
			}

			public void AddFooterItem(List<String> items) {
				mDatas.addAll(items);
				notifyDataSetChanged();
			}

			/**
			 * 更新加载更多状态
			 * @param status
			 */
			public void changeMoreStatus(int status){
				mLoadMoreStatus=status;
				notifyDataSetChanged();
			}
		}

com/example/administrator/MainActivity.java

		private void initLoadMoreListener() {
			mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
				int lastVisibleItem ;
				@Override
				public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
					super.onScrollStateChanged(recyclerView, newState);

					//判断RecyclerView的状态 是空闲时,同时,是最后一个可见的ITEM时才加载
					if(newState==RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItem+1==mRefreshAdapter.getItemCount()){

						//设置正在加载更多
						mRefreshAdapter.changeMoreStatus(mRefreshAdapter.LOADING_MORE);

						new Handler().postDelayed(new Runnable() {
							@Override
							public void run() {

								List<String> footerDatas = new ArrayList<String>();
								for (int i = 0; i< 10; i++) {

									footerDatas.add("footer  item" + i);
								}
								mRefreshAdapter.AddFooterItem(footerDatas);
								//设置回到上拉加载更多
								mRefreshAdapter.changeMoreStatus(mRefreshAdapter.PULLUP_LOAD_MORE);
								Toast.makeText(MainActivity.this, "更新了 "+footerDatas.size()+" 条目数据", Toast.LENGTH_SHORT).show();
							}
						}, 3000);


					}

				}

				@Override
				public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
					super.onScrolled(recyclerView, dx, dy);

				   LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
					//最后一个可见的ITEM
					lastVisibleItem=layoutManager.findLastVisibleItemPosition();
				}
			});

		}
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值