RecyclerView添加header和footer

RecyclerView是android 5.0之后的一个新特性控件,用起来很强大,它代替了已有的ListView,

RecyclerView可以实现ListView的效果,GridView的效果,还可以实现瀑布流。


问题:
 
1、如何给RecyclerView添加头部文件,

2、如何让RecyclerView显示不同的样式

 
     大家在使用ListView的时候可以很轻松的添加headers, 但是不知道大家发现没有,RecyclerView和各种LayoutManager都没有哪个方法是为添加header而设立的,这个时候我们就开始思考如何为RecyclerView添加header了。 这里我们的解决方案和网上你能搜到的大多数方案一样,是通过控制Adapter的itemType来设置的,思路就是根据不同的itemType去加载不同的布局。

public class RecyclerWrapAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static final int TYPE_HEADER = 0;
    public static final int TYPE_NORMAL = 1;
    private ArrayList<DetailsInfo> mDatas = new ArrayList<>();
    private View mHeaderView;

    public void setmHeaderView(View mHeaderView) {
        this.mHeaderView = mHeaderView;
        notifyDataSetChanged();
    }

    public View getmHeaderView() {
        return mHeaderView;
    }


    public void addDatas(ArrayList<DetailsInfo> datas) {
        mDatas.addAll(datas);
        notifyDataSetChanged();
    }

    @Override
    public int getItemViewType(int position) {
        if (mHeaderView == null) return TYPE_NORMAL;
        if (position == 0) return TYPE_HEADER;
        return TYPE_NORMAL;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (mHeaderView != null && viewType == TYPE_HEADER) return new Holder(mHeaderView);
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.detalis_layout_item, null);
        return new Holder(view);
    }

    class Holder extends RecyclerView.ViewHolder {
        TextView bossName, detallisNumber, detalisTime, detalisType, detalisSate;

        public Holder(View itemView) {
            super(itemView);
            bossName = (TextView) itemView.findViewById(R.id.bossName);
            detallisNumber = (TextView) itemView.findViewById(R.id.detallisNumber);
            detalisTime = (TextView) itemView.findViewById(R.id.detalisTime);
            detalisType = (TextView) itemView.findViewById(R.id.detalisType);
            detalisSate = (TextView) itemView.findViewById(R.id.detalisSate);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (getItemViewType(position) == TYPE_HEADER) return;
        final int pos = getRealPosition(holder);
        final DetailsInfo data = mDatas.get(pos);
        if (holder instanceof Holder) {
            Holder holder1s = (Holder) holder;
            holder1s.bossName.setText(data.getClientId());
            holder1s.detalisSate.setText(data.getDetailsState());
            holder1s.detalisType.setText(data.getDetailsType());
            holder1s.detalisTime.setText(data.getOrdersTime());
            holder1s.detallisNumber.setText(data.getDetailsNumber());
        }
    }

    public void UpDateDetalis(ArrayList<DetailsInfo> infos) {
        if (infos != null) {
            this.mDatas = infos;
        }
        notifyDataSetChanged();
    }

    public int getRealPosition(RecyclerView.ViewHolder holder) {
        int position = holder.getLayoutPosition();
        return mHeaderView == null ? position : position - 1;
    }

    @Override
    public int getItemCount() {
        return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;
       }

}
这里我们重写了getItemViewType方法,并根据位置来返回不同的type,这个type是我们预先商定好的常量,接在onCreateViewHolder方法中来判断itemType,如果是header,则返回我们设置的headerView,否则正常加载item布局,相信大家对于上面的代码不会有任何疑问,接下来我们就在Fragment中用一下试试看:
 

    
    
mLayoutManager = new LinearLayoutManager( this , LinearLayoutManager.VERTICAL, false ); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setItemAnimator( new DefaultItemAnimator()); mAdapter = new MyAdapter(); mRecyclerView.setAdapter(mAdapter); mAdapter.addDatas(generateData()); setHeader(mRecyclerView); mAdapter.setOnItemClickListener( new MyAdapter.OnItemClickListener() { @Override public void onItemClick( int position, String data) { Toast.makeText(MainActivity. this , data, Toast.LENGTH_SHORT).show(); } });
private void setHeader(RecyclerView view) {
  View header = LayoutInflater.from(this).inflate(R.layout.header, view, false);
  mAdapter.setHeaderView(header);
}
上面添加了HeaderView 相信聪明的你,也已经学会了怎样去添加FooterView了吧!

下面我们再来看看如何给RecyclerView设置不同的样式

LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL);

设置RecyclerView 为线性,垂直放下,最后还别忘了添加一句代码
RecyclerView.setLayoutManager(manager);
RecyclerView.setadapter(adapter);
瀑布流显示:
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)); //垂直方向显示 每行显示2个
RecyclerView.setLayoutManager(manager);
RecyclerView.setadapter(adapter);
 表格显示:
GridLayoutManager girdLayoutManager=new GridLayoutManager(this,4);每行显示四个
RecyclerView .setLayoutManager(girdLayoutManager);
RecyclerView.setadapter(adapter);



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值