关于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实现上拉和下拉刷新的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)