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
原创粉丝点击