Android RecyclerView实现下拉刷新和上拉加载更多pc软件 文章资讯 手机软件

您当前的位置→图文中心软件教程Android RecyclerView实现下拉刷新和上拉加载更多
阅读排行

Android RecyclerView实现下拉刷新和上拉加载更多


2017/2/20  编辑:admin 来源:本站整理

使用官方官网的刷新控件SwipeRefreshLayout来实现下拉刷新, 当RecyclerView滑到底部实现下拉加载(进度条效果用RecyclerView加载一个布局实现)

有请求需要完成控件的下拉监听和上拉监听, 其中, 下拉监听可以通过SwipRefreshLayout的setOnRefreshListener()方法监听, 而上拉刷新, 需要通过监听列表的滚动, 当列表滚动到底部时触发事件, 具体代码如下

主布局

<?xml version="1.0" encoding="utf-8"?><android.support.v4.widget.SwipeRefreshLayout android:id="@+id/refresh_layout" xmlns:android="http://schemas.android.com/apk/res/android"; android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView  android:id="@+id/recycler_list"  android:layout_width="match_parent"  android:layout_height="match_parent"/></android.support.v4.widget.SwipeRefreshLayout>
public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener { private SwipeRefreshLayout refreshLayout; private RecyclerView recyclerView; private LinearLayoutManager layoutManager; private RecyclerAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  initViews(); } private void initViews() {  refreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh_layout);  recyclerView = (RecyclerView) findViewById(R.id.recycler_list);  layoutManager = new LinearLayoutManager(this);  refreshLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary);//布置设置刷新时进度条颜色, 最多四种  refreshLayout.setOnRefreshListener(this);  mAdapter = new RecyclerAdapter();//自已来定义的适配器  recyclerView.setAdapter(mAdapter);  recyclerView.setLayoutManager(layoutManager);  recyclerView.addOnScrollListener(new OnRecyclerScrollListener()); } /**  * 用于下拉刷新  */ @Override public void onRefresh() { } /**  * 用于上拉加载更多  */ public class OnRecyclerScrollListener extends RecyclerView.OnScrollListener {  int lastVisibleItem = 0;  @Override  public void onScrollStateChanged(RecyclerView recyclerView, int newState) {   super.onScrollStateChanged(recyclerView, newState);   if (mAdapter != null && newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == mAdapter.getItemCount()) {    //滚动到底部了, 可以能够来进行数据信息加载等操作   }  }  @Override  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {   super.onScrolled(recyclerView, dx, dy);   lastVisibleItem = layoutManager.findLastVisibleItemPosition();  } }}

下面是实现上拉时进度条转动的效果

item_list_footer.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android";    android:layout_width="match_parent"    android:layout_height="match_parent"> <TextView  android:id="@+id/tv_item_footer_load_more"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:layout_margin="16dp"  android:gravity="center"  android:text="上拉加载更多" /> <ProgressBar  android:id="@+id/pb_item_footer_loading"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:layout_margin="16dp"android:visibility="gone"/></RelativeLayout>

适配器

public class RecyclerAdapter extends RecyclerView.Adapter<ViewHolder> { private static final int TYPE_CONTENT = 0; private static final int TYPE_FOOTER = 1; private ArrayList<DataBean> dataList; private ProgressBar pbLoading; private TextView tvLoadMore; public RecyclerAdapter() {  dataList = new ArrayList<>(); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  if (viewType == TYPE_CONTENT) {   return new ContentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_content, parent, false));  } else if (viewType == TYPE_FOOTER) {//加载进度条的布局   return new FooterViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_footer, parent, false));  }  return null; } @Override public void onBindViewHolder(ViewHolder holder, int position) {  int type = getItemViewType(position);  if (type == TYPE_CONTENT) {   DataBean bean = dataList.get(position);   ((ContentViewHolder) holder).tvId.setText("" + bean.getId());   ((ContentViewHolder) holder).tvName.setText(bean.getName());  } else if (type == TYPE_FOOTER) {   pbLoading = ((FooterViewHolder) holder).pbLoading;   tvLoadMore = ((FooterViewHolder) holder).tvLoadMore;  } } /**  * 获取数据集加上一个footer的数量  */ @Override public int getItemCount() {  return dataList.size() + 1; } @Override public int getItemViewType(int position) {  if (position + 1 == getItemCount()) {   return TYPE_FOOTER;  } else {   return TYPE_CONTENT;  } } /**  * 获取数据集的大小  */ public int getListSize() {  return dataList.size(); } /**  * 内容的ViewHolder  */ public static class ContentViewHolder extends ViewHolder {  private TextView tvId, tvName;  public ContentViewHolder(View itemView) {   super(itemView);   tvId = (TextView) itemView.findViewById(R.id.tv_item_id);   tvName = (TextView) itemView.findViewById(R.id.tv_item_name);  } } /**  * footer的ViewHolder  */ public static class FooterViewHolder extends ViewHolder {  private TextView tvLoadMore;  private ProgressBar pbLoading;  public FooterViewHolder(View itemView) {   super(itemView);   tvLoadMore = (TextView) itemView.findViewById(R.id.tv_item_footer_load_more);   pbLoading = (ProgressBar) itemView.findViewById(R.id.pb_item_footer_loading);  } } /**  * 显示正就在加载的进度条, 滑动到底部时, 调用该方法, 上拉就显示进度条, 隐藏"上拉加载更多"  */ public void showLoading() {  if (pbLoading != null && tvLoadMore != null) {   pbLoading.setVisibility(View.VISIBLE);   tvLoadMore.setVisibility(View.GONE);  } } /**  * 显示上拉加载的文字, 当数据加载完毕, 调用该方法, 隐藏进度条, 显示“上拉加载更多”  */ public void showLoadMore() {  if (pbLoading != null && tvLoadMore != null) {   pbLoading.setVisibility(View.GONE);   tvLoadMore.setVisibility(View.VISIBLE);  } }}

相关文章
  • NANA已经证明了太空飞行影响人类
  • 安卓端车牌识别,日后Android车牌识别sdk会用到安卓端车牌识别
  • 视频转场音效包transition sfx免费下载
  • Android 8.OBUG闹铃失效
  • 魔兽世界WoW Legion companion随身app不能安装怎么解决
  • 免费的压缩软件Bandizip介绍
  • Android应用的启动性能,如何测试Android应用的启动速度
  • urban revivo是哪个国家的牌子 urban revivo是什么档次
  • Android中Glide获取缓存大小并清除缓存图片
  • 安卓Android手机的神秘黑客代码
  • 【王者荣耀】大乔觉醒!快上CHUAN(G)!没时间解释了!!!
  • 科达发布24盘位IPSAN磁盘存储阵列
  • WannaCry病毒肆虐全球,唯有这家网络安全公司融资1亿美金却笑不出来
  • 世嘉经典街机《疯狂出租车》登陆iOS/Android:免费
  • 济南网站建设教你如何快速搞定banner!
  • 王者荣耀:新赛季新出的三个英雄,最后一个大招变态,征召非BAN继选
  • 解决历史难题!Android 8.0升级机制 不弃老用户
  • 厉害了!安卓将迎来大变革,Android8或赶超iOS
  • Android之Binder底层原理详解必读
  • 传播了150多个国家的“WannaCry”勒索软件,目前仅赚到5万美金
  • 发表评论
    网站帮助 - 广告合作 - 下载声明 - 网站地图