Android App使用RecyclerView实现上拉和下拉刷新的方法

Android App使用RecyclerView实现上拉和下拉刷新的方法,第1张

概述关于RecyclerViewRecyclerView在Android5.0以来被引入,以前经常使用的ListView继承的是AbsListView,而RecyclerView则直接继承ViewGroup,并实现了ScrollingView和NestedScrollingChild接口,RecyclerView相比List

关于RecyclerVIEw

RecyclerVIEw在AndroID 5.0以来被引入,以前经常使用的ListVIEw 继承的是AbsListVIEw,而RecyclerVIEw则直接继承 VIEwGroup,并实现了ScrollingVIEw 和 nestedScrollingChild接口,RecyclerVIEw相比ListVIEw,是一次彻底的改变。
RecyclerVIEw比ListvIEw更先进更灵活,对于很多的视图它就是一个容器,可以有效的重用和滚动。当数据动态变化的时候请使用它。
RecyclerVIEw使用起来很方便因为它提供:
1、它为item的定位提供一个layoutmanager
2、为item的 *** 作提供一个缺省的animations
3、还可以灵活地定义这个小部件的自定义布局管理器和动画

实现上拉刷新下拉刷新
布局文件:

<androID.support.v4.Widget.SwipeRefreshLayout   xmlns:androID="http://schemas.androID.com/apk/res/androID"   xmlns:tools="http://schemas.androID.com/tools"   androID:ID="@+ID/swipe_refresh_Widget"   androID:layout_wIDth="match_parent"   androID:layout_height="match_parent" >    <androID.support.v7.Widget.RecyclerVIEw     androID:ID="@androID:ID/List"     androID:layout_wIDth="match_parent"     androID:layout_height="match_parent"     androID:cachecolorHint="@null"     androID:scrollbars="vertical" />  </androID.support.v4.Widget.SwipeRefreshLayout> 

在Activity中引用这个布局并初始化

@OverrIDe  protected voID onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentVIEw(R.layout.activity_main);   mSwipeRefreshWidget = (SwipeRefreshLayout) findVIEwByID(R.ID.swipe_refresh_Widget);  mRecyclerVIEw = (RecyclerVIEw) findVIEwByID(androID.R.ID.List);   mSwipeRefreshWidget.setcolorScheme(R.color.color1,R.color.color2,R.color.color3,R.color.color4);  mSwipeRefreshWidget.setonRefreshListener(this);   // 这句话是为了,第一次进入页面的时候显示加载进度条  mSwipeRefreshWidget.setProgressVIEwOffset(false,(int) TypedValue   .applyDimension(TypedValue.COMPLEX_UNIT_DIP,24,getResources()    .getdisplayMetrics()));   mRecyclerVIEw.setonScrollListener(new RecyclerVIEw.OnScrollListener() {    @OverrIDe   public voID onScrollStateChanged(RecyclerVIEw recyclerVIEw,int newState) {   super.onScrollStateChanged(recyclerVIEw,newState);   if (newState == RecyclerVIEw.SCRolL_STATE_IDLE    && lastVisibleItem + 1 == adapter.getItemCount()) {    mSwipeRefreshWidget.setRefreshing(true);    // 此处在现实项目中,请换成网络请求数据代码,sendRequest .....    handler.sendEmptyMessageDelayed(0,3000);   }   }    @OverrIDe   public voID onScrolled(RecyclerVIEw recyclerVIEw,int dx,int dy) {   super.onScrolled(recyclerVIEw,dx,dy);   lastVisibleItem = mLayoutManager.findLastVisibleItemposition();   }   });   mRecyclerVIEw.setHasFixedSize(true);  mLayoutManager = new linearlayoutmanager(this);  mRecyclerVIEw.setLayoutManager(mLayoutManager);  mRecyclerVIEw.setItemAnimator(new DefaultItemAnimator());   adapter = new SampleAdapter();  mRecyclerVIEw.setAdapter(adapter);   // 此处在现实项目中,请换成网络请求数据代码,sendRequest .....  handler.sendEmptyMessageDelayed(0,3000);  } 

SwipeRefreshLayout里面需要注意的API:
1、setonRefreshListener(OnRefreshListener Listener)  设置下拉监听,当用户下拉的时候会去执行回调
2、setcolorSchemecolors(int... colors) 设置 进度条的颜色变化,最多可以设置4种颜色
3、setProgressVIEwOffset(boolean scale,int start,int end) 调整进度条距离屏幕顶部的距离
4、setRefreshing(boolean refreshing) 设置SwipeRefreshLayout当前是否处于刷新状态,一般是在请求数据的时候设置为true,在数据被加载到VIEw中后,设置为false。

RecyclerVIEw的实现:

第一种,下拉刷新和上拉刷新都用SwipeRefreshLayout 自带的进度条

mRecyclerVIEw = (RecyclerVIEw) findVIEwByID(androID.R.ID.List); mRecyclerVIEw.setonScrollListener(new RecyclerVIEw.OnScrollListener() {    @OverrIDe   public voID onScrollStateChanged(RecyclerVIEw recyclerVIEw,dy);   lastVisibleItem = mLayoutManager.findLastVisibleItemposition();   }  });   mRecyclerVIEw.setHasFixedSize(true);  mLayoutManager = new linearlayoutmanager(this);  mRecyclerVIEw.setLayoutManager(mLayoutManager);  mRecyclerVIEw.setItemAnimator(new DefaultItemAnimator());   adapter = new SampleAdapter();  mRecyclerVIEw.setAdapter(adapter); 

第二种实现下拉刷新用SwipeRefreshLayout 自带的进度条, 上拉刷新用类似ListVIEw的刷新 提示“加载中”等信息。

我们可以给RecyclerVIEw 也添加一个类似FooterVIEw的item。
我们在Adapter中实现:

public class SampleAdapter extends RecyclerVIEw.Adapter<VIEwHolder> {  private List<Integer> List;   private static final int TYPE_ITEM = 0;  private static final int TYPE_FOOTER = 1;   public List<Integer> getList() {  return List;  }   public SampleAdapter() {  List = new ArrayList<Integer>();  }   // RecyclerVIEw的count设置为数据总条数+ 1(footerVIEw)  @OverrIDe  public int getItemCount() {  return List.size() + 1;  }   @OverrIDe  public int getItemVIEwType(int position) {  // 最后一个item设置为footerVIEw  if (position + 1 == getItemCount()) {   return TYPE_FOOTER;  } else {   return TYPE_ITEM;  }  }   @OverrIDe  public voID onBindVIEwHolder(VIEwHolder holder,final int position) {  if (holder instanceof ItemVIEwHolder) {   ((ItemVIEwHolder) holder).textVIEw.setText(String.valueOf(List    .get(position)));  }  }   @OverrIDe  public VIEwHolder onCreateVIEwHolder(VIEwGroup parent,int vIEwType) {  if (vIEwType == TYPE_ITEM) {   VIEw vIEw = LayoutInflater.from(parent.getContext()).inflate(    R.layout.List_item_text,null);   vIEw.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));   return new ItemVIEwHolder(vIEw);  }  // type == TYPE_FOOTER 返回footerVIEw  else if (vIEwType == TYPE_FOOTER) {   VIEw vIEw = LayoutInflater.from(parent.getContext()).inflate(    R.layout.footervIEw,LayoutParams.WRAP_CONTENT));   return new FooterVIEwHolder(vIEw);  }   return null;  }   class FooterVIEwHolder extends VIEwHolder {   public FooterVIEwHolder(VIEw vIEw) {   super(vIEw);  }   }   class ItemVIEwHolder extends VIEwHolder {  TextVIEw textVIEw;   public ItemVIEwHolder(VIEw vIEw) {   super(vIEw);   textVIEw = (TextVIEw) vIEw.findVIEwByID(R.ID.text);  }  } } 

这样我们就可以针对footervIEw的布局做一些处理了,比如提示“加载中,”,“已经全部加载”等信息。更加灵活一点

总结

以上是内存溢出为你收集整理的Android App使用RecyclerView实现上拉和下拉刷新的方法全部内容,希望文章能够帮你解决Android App使用RecyclerView实现上拉和下拉刷新的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1141366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存