Android开发之RecyclerView的上拉刷新和下拉加载
来源:互联网 发布:中二网络意思 编辑:程序博客网 时间:2024/06/05 07:58
Android开发之RecyclerView的上拉刷新和下拉加载
自2015年谷歌开发者大会的召开后,给我们推出了一个新的控件即RecyclerView,它将逐步取代ListView和GriView,对于一些资讯类新闻类的App而言,下拉刷新上拉加载都是不可缺少的功能,那么RecyclerView如何实现上拉刷新和下拉加载呢,经过本人一段时间的研究,终于实现了,下面将代码贴出,还望诸位大神批评指正,灰常感谢♪(^∇^*)
特别注意:
由于本人的Demo中集成了DATABINDINGLIBRARY,即数据绑定库,故使用AS开发的话,需要配置这两步:
1.在项目的build.gradle(非module)中的dependencies下添加配置
classpath "com.android.databinding:dataBinder:1.0-rc1"
2.在module的build.gradle中的添加配置
apply plugin: 'com.android.databinding'
效果图如下:
核心代码如下:
MainActivity
package com.hxht.testrecyclerviewloadmore;import android.databinding.DataBindingUtil;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.View;import android.widget.Toast;import com.hxht.testrecyclerviewloadmore.adapter.MyRecyclerViewAdapter;import com.hxht.testrecyclerviewloadmore.callback.OnRcvScrollListener;import com.hxht.testrecyclerviewloadmore.databinding.ActivityMainBinding;import com.hxht.testrecyclerviewloadmore.domain.HelpClass;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; private List<String> list; private int index = 1; private int page = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); initData(); } private void initView() { binding = DataBindingUtil.setContentView(this, R.layout.activity_main); } private void initData() { HelpClass helpClass = new HelpClass("正在加载、、、"); binding.setHelpclass(helpClass); list = new ArrayList<>(); list.clear(); for (int i = 1; i < 201; i++) { list.add("测试" + (i < 10 ? "0" + i : i)); } final MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(MainActivity.this, list); RecyclerView.LayoutManager manager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false); binding.recycleview.setAdapter(adapter); binding.recycleview.setLayoutManager(manager); binding.recycleview.addItemDecoration(new DividerItemDecoration(MainActivity.this, DividerItemDecoration.VERTICAL_LIST)); int[] colos = new int[]{ Color.RED, Color.YELLOW, Color.GREEN, Color.BLUE, Color.BLACK }; binding.swiperefreshlayout.setColorSchemeColors(colos); binding.swiperefreshlayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { list.clear(); int count = index++; for (int i = 1; i < 201; i++) { list.add("第" + count + "次刷新---item" + (i < 10 ? "0" + i : i)); } adapter.notifyDataSetChanged(); binding.swiperefreshlayout.setRefreshing(false); } }, 5000); } }); binding.recycleview.setOnScrollListener(new OnRcvScrollListener() { @Override public void onBottom() { super.onBottom(); Handler handler = new Handler(); binding.tvLoadMore.setVisibility(View.VISIBLE); handler.postDelayed(new Runnable() { @Override public void run() { int currentPage = page++; int position = list.size() ; for (int i = 1; i < 201; i++) { list.add("加载出第" + currentPage + "页的数据" + (i < 10 ? "0" + i : i)); } adapter.notifyDataSetChanged(); binding.tvLoadMore.setVisibility(View.GONE); binding.recycleview.smoothScrollToPosition(position); } }, 3000); } }); }}
MyRecyclerViewAdapter
package com.hxht.testrecyclerviewloadmore.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import com.hxht.testrecyclerviewloadmore.R;import java.util.List;public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> { private Context mContext; private List<String> list; public MyRecyclerViewAdapter(Context mContext, List<String> list) { this.mContext = mContext; this.list = list; } private interface OnItemClickListener { void onItemClick(View view, int position); } private OnItemClickListener mOnItemClickListener; public OnItemClickListener getmOnItemClickListener() { return mOnItemClickListener; } public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener) { this.mOnItemClickListener = mOnItemClickListener; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(mContext, R.layout.activity_rv_item, null); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, final int position) { holder.tv.setText(list.get(position)); holder.view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(v, position); } } }); } @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder { private View view; private TextView tv; public MyViewHolder(View itemView) { super(itemView); this.view = itemView; this.tv = (TextView) view.findViewById(R.id.tv); } }}
OnBottomListener
package com.hxht.testrecyclerviewloadmore.callback;public interface OnBottomListener { void onBottom();}
OnRecyclerViewScrollListener
package com.hxht.testrecyclerviewloadmore.callback;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;public class OnRecyclerViewScrollListener extends RecyclerView.OnScrollListener implements OnBottomListener { private String TAG = getClass().getSimpleName(); public static enum LAYOUT_MANAGER_TYPE { LINEAR, GRID, STAGGERED_GRID } protected LAYOUT_MANAGER_TYPE layoutManagerType; private int[] lastPositions; private int lastVisibleItemPosition; private int currentScrollState = 0; @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); // int lastVisibleItemPosition = -1; if (layoutManagerType == null) { if (layoutManager instanceof LinearLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR; } else if (layoutManager instanceof GridLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.GRID; } else if (layoutManager instanceof StaggeredGridLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID; } else { throw new RuntimeException( "Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager"); } } switch (layoutManagerType) { case LINEAR: lastVisibleItemPosition = ((LinearLayoutManager) layoutManager) .findLastVisibleItemPosition(); break; case GRID: lastVisibleItemPosition = ((GridLayoutManager) layoutManager) .findLastVisibleItemPosition(); break; case STAGGERED_GRID: StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager; if (lastPositions == null) { lastPositions = new int[staggeredGridLayoutManager.getSpanCount()]; } staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions); lastVisibleItemPosition = findMax(lastPositions); break; } } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); currentScrollState = newState; RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); int visibleItemCount = layoutManager.getChildCount(); int totalItemCount = layoutManager.getItemCount(); if ((visibleItemCount > 0 && currentScrollState == RecyclerView.SCROLL_STATE_IDLE && (lastVisibleItemPosition) >= totalItemCount - 1)) { onBottom(); } } @Override public void onBottom() {} private int findMax(int[] lastPositions) { int max = lastPositions[0]; for (int value : lastPositions) { if (value > max) { max = value; } } return max; }}
DividerItemDecoration
package com.hxht.testrecyclerviewloadmore;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;public class DividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Context context, int orientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); setOrientation(orientation); } public void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); RecyclerView v = new RecyclerView(parent.getContext()); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } }}
HelpClass
package com.hxht.testrecyclerviewloadmore.domain;public class HelpClass { private String tv_name ; public HelpClass(String tv_name) { this.tv_name = tv_name; } public String getTv_name() { return tv_name; } public void setTv_name(String tv_name) { this.tv_name = tv_name; } @Override public String toString() { return "HelpClass{" + "tv_name='" + tv_name + '\'' + '}'; }}
代码已贴出,正所谓取之于社会,回报于社会,还望诸位大神批评指正,不喜勿喷,灰常感谢♪(^∇^*)
1 0
- Android开发之RecyclerView的上拉刷新和下拉加载
- Android 实现RecyclerView的下拉刷新和上拉加载
- Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载
- android 打造真正的下拉刷新上拉加载recyclerview(三):下拉刷新上拉加载
- android 打造真正的下拉刷新上拉加载recyclerview(三):下拉刷新上拉加载
- android之recyclerview上拉加载下拉刷新
- RecyclerView 下拉刷新和上拉加载
- Android RecyclerView下拉刷新和上拉加载更多
- Android RecyclerView下拉刷新和上拉加载更多
- RecyclerView的上拉加载,下拉刷新
- recyclerView的下拉刷新和上拉加载
- RecyclerView的上拉刷新,和下拉加载
- Recyclerview的下拉刷新和上拉加载
- RecyclerView的上拉加载和下拉刷新
- android 打造真正的下拉刷新上拉加载recyclerview(四):自动加载和其他封装
- android 打造真正的下拉刷新上拉加载recyclerview(四):自动加载和其他封装
- Android实现RecyclerView的下拉刷新和上拉加载更多
- 【Android实战】----RecyclerView下拉刷新和上拉加载的简单实现
- Windows + Git(msysgit) + TortoiseGit
- Android Data Storage(数据存储)之SharedPreferences
- 用SignalR 2.0开发客服系统[系列2:实现聊天室]
- 神经网络简史
- Redhat XFS File System Guide
- Android开发之RecyclerView的上拉刷新和下拉加载
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
- poj 2010
- dede在首页调用文章页全部内容的方法
- Java中的常量、静态域与静态方法
- 键盘弹出时,遮挡文本输入区域
- <Java 并发编程实践>读书笔记 --- 内部锁
- 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]
- 一文读懂卷积神经网络