iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android RecyclerView实现下拉刷新和上拉加载更多
  • 949
分享到

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

recyclerviewAndroid 2022-06-06 04:06:16 949人浏览 独家记忆
摘要

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

使用官方的刷新控件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;
  }
 }
 
 @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();
 }
 
 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);
  }
 }
 
 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);
  }
 }
}
您可能感兴趣的文章:Android实现上拉加载更多以及下拉刷新功能(ListView)Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法Android ListView实现上拉加载更多和下拉刷新功能Android下拉刷新上拉加载更多左滑动删除Android XListView下拉刷新和上拉加载更多Android RecyclerView下拉刷新和上拉加载更多Android 仿硅谷新闻下拉刷新/上拉加载更多Android中Listview下拉刷新和上拉加载更多的多种实现方案android使用PullToRefresh框架实现ListView下拉刷新上拉加载更多Android实践之带加载效果的下拉刷新上拉加载更多


--结束END--

本文标题: Android RecyclerView实现下拉刷新和上拉加载更多

本文链接: https://www.lsjlt.com/news/22188.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作