recyclerview(二)添加头尾布局
来源:互联网 发布:firewall cmd 80端口 编辑:程序博客网 时间:2024/06/06 07:37
recyclerview有很强大的定制功能,但是刚接触的伙伴感觉肯定没有listview用着那么顺手。像listview的添加头布局(addHeadView),脚布局(footView)等api都是没有的,需要自己动手实现,今天实现一个为recyclerview添加脚布局进行上拉加载的逻辑。
虽然recyclerview没有添加头尾布局的api,但在recyclerview的adapter中有这样一个重写的方法getItemViewType(int position),顾名思义,这个方法返回的是一个viewType,一个view的类型,而在我么的onCreateViewHolder(ViewGroup parent, int viewType)方法中,第二个参数恰好是viewType。其实getItemViewType()返回的viewType就是onCreateViewHolder()方法对应的viewType,这样一看瞬间明白了。
主要代码片段和注释:
private static final int TYPE_ITEM =0; //普通Item View private static final int TYPE_FOOTER = 1; //底部FootView public static final int PULLUP_LOAD_MORE=0; //上拉加载 public static final int LOADING_MORE=1; //正在加载中 public static final int NO_MORE_DATA = 2; //加载完成没有数据 private int load_more_status=0; //上拉加载状态默认0 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //判断返回的ViewType是那种类型 if (viewType == TYPE_ITEM) { ItemViewHolder ItemViewHolder = new ItemViewHolder (LayoutInflater.from(context).inflate(R.layout.memberadapter_item, parent, false)); return ItemViewHolder ; }else if (viewType == TYPE_FOOTER){ FootViewHolder footViewHolder = new FootViewHolder(LayoutInflater.from(context).inflate(R.layout.recycler_load_more_layout,parent,false)); return footViewHolder ; } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //根据返回的holder判断是普通条目还是脚布局,然后进行设置 if (holder instanceof ItemViewHolder ){ ((ItemViewHolder ) holder).tv_member_item.setText(list.get(position).getVipName()); }else if (holder instanceof FootViewHolder){ switch (load_more_status){ case LOADING_MORE: ((FootViewHolder) holder).foot_view_item_tv.setText("正在加载数据"); ((FootViewHolder) holder).pull_to_refresh_load_progress.setVisibility(View.VISIBLE); break; case PULLUP_LOAD_MORE: if (getItemCount()<20){ ((FootViewHolder) holder).foot_view_item_tv.setText(""); ((FootViewHolder) holder).pull_to_refresh_load_progress.setVisibility(View.INVISIBLE); }else { ((FootViewHolder) holder).foot_view_item_tv.setText("上拉加载更多"); ((FootViewHolder) holder).pull_to_refresh_load_progress.setVisibility(View.INVISIBLE); } break; case NO_MORE_DATA: ((FootViewHolder) holder).foot_view_item_tv.setText("没有更多数据了"); ((FootViewHolder) holder).pull_to_refresh_load_progress.setVisibility(View.INVISIBLE); break; } } }//根据position的位置判断是普通条目还是脚布局 @Override public int getItemViewType(int position) { if (position+1 == getItemCount()){ return TYPE_FOOTER; }else { return TYPE_ITEM; } } @Override public int getItemCount() { return list.size()+1; //因为在底部添加了脚布局,所以Count的数量要+1 } public static class ItemViewHolder extends RecyclerView.ViewHolder { //普通条目的ViewHOlder TextView tv_member_item; public ItemViewHolder (View itemView) { super(itemView); tv_member_item = (TextView) itemView.findViewById(R.id.tv_member_item); } } //添加的脚布局的ViewHolder public static class FootViewHolder extends RecyclerView.ViewHolder { TextView foot_view_item_tv; ProgressBar pull_to_refresh_load_progress; public FootViewHolder (View itemView) { super(itemView); foot_view_item_tv = (TextView) itemView.findViewById(R.id.foot_view_item_tv); pull_to_refresh_load_progress = (ProgressBar) itemView.findViewById(R.id.pull_to_refresh_load_progress); } } public void ChangeState(int statu){ load_more_status=statu; }}
在代码中使用,将recyclerview设置滚动监听
private int lastVisibleItem; final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); rcMemberView.setLayoutManager(linearLayoutManager); adapter = new MemberRecyclerAdapter(this); rcMemberView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) { super.onScrollStateChanged(recyclerView, newState); //判断是否滑动到底部 if (newState == recyclerView.SCROLL_STATE_IDLE && lastVisibleItem+1== adapter.getItemCount()){ //此处做加载数据操作,并调用adapter.changeMoreStatus()时时改变底部局的状态 }); @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); } });
布局文件就不贴了,只有一个TextView+一个ProgressBar
0 0
- recyclerview(二)添加头尾布局
- RecyclerView使用(头尾布局)
- 给RecyclerView添加头尾
- 优雅的为RecyclerView添加头尾布局HeaderAndFooterWrapper
- RecyclerView加载headView和footView,添加头尾布局
- RecyclerView基本用法(添加分割线,添加头尾布局,下拉刷新上拉加载,添加删除item,以及监听事件)
- RecyclerView使用(二)多种Item布局、添加点击事件
- 为Recycle添加头尾布局的BaseAdapter
- RecyclerView添加头布局
- RecyclerView添加多种布局
- Recyclerview添加头布局
- RecyclerView头布局添加
- RecyclerView添加头布局
- ReactNative基础(八)了解FlatList的使用、添加头尾布局、下拉刷新、上拉加载
- RecyclerView的添加头部布局
- RecyclerView添加Header(头布局)+无限轮播
- (4.1.45.1)RecyclerView 添加头部和尾部布局 一
- xListView头尾布局
- Android学习之路---使用ViewPager实现引导页
- 人物血条的变化
- Linux下C语言Socket编程
- python3.5安装pycrypto的问题
- nginx里如何配置项目域名
- recyclerview(二)添加头尾布局
- Codeforces Round #391 -B. Bash's Big Day
- Android 判断是开发debug模式,还是发布release模式
- zoj1623
- InI文件工具类
- Ogre Overlay 加载失败
- [BZOJ2467][中山市选2010]生成树(组合数学)
- jQuery与其它库冲突的解决方法
- Android(安卓)面试中常见的一些面试题和答案,希望对大家有用