RecycleView添加headerView

这两日在写一个小东西,需要给RecycleView添加一个headerView(轮播图),总结一下吧

思路

  • 在RecycleView的Adapter里面声明一个内部view变量
  • 然后在CreatView方法里面判断位置,如果是position为0的话就代表加载的是第一个
  • 那么就把我们事先声明的View放在这个位置

代码

public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.ViewHolder> {

    //定义有无HeadView的两种状态
    public static final int TYPE_HEADER = 0;
    public static final int TYPE_NORMAL = 1;
    //声明传进来的HeadView
    private View mHeaderView;

    //给将HeadView设置到RecycleView第一个位置
    public void setHeaderView(View headerView) {
        mHeaderView = headerView;
        notifyItemInserted(0);
    }

    public View getHeaderView() {
        return mHeaderView;
    }

    //获取子项View类型,如果有HeadView且为第0项,则此时这个Item为HeadView  否则为正常View
    @Override
    public int getItemViewType(int position) {
        if(mHeaderView == null) return TYPE_NORMAL;
        if(position == 0) return TYPE_HEADER;
        return TYPE_NORMAL;
    }


    private List<News> newsList;
    private Context context;

    //构造方法,传进来数据
    public RecycleViewAdapter(Context context,ArrayList<News> list){
        this.newsList = list;
        this.context = context;
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        ImageView imageView;
        TextView title;
        TextView schoolAndTime;

        public ViewHolder(View itemView) {
            super(itemView);
            //进行判断,如果此时Item为HeadView,则直接返回,否则findViewByID
            if(itemView == mHeaderView) return;
            imageView = itemView.findViewById(R.id.main_Fra1RecVeiwItemImage);
            title = itemView.findViewById(R.id.main_Fra1RecVeiwItemTitle);
            schoolAndTime = itemView.findViewById(R.id.main_Fra1RecVeiwItemSchoolAndTime);
        }
    }

    //通过参数ViewType隐性调用getViewType获取此时Item类型
    //如果是头部,则调用ViewHolder构造方法创建一个ViewHolder
    //因为HeadVIew在最初已经传进来了所以不需要Inflate
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(mHeaderView != null && viewType == TYPE_HEADER) return new ViewHolder(mHeaderView);

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment1recyclenews,parent,false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    //绑定数据方法
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(getItemViewType(position) == TYPE_HEADER) return;

        final int pos = getRealPosition(holder);
        final News news = newsList.get(pos);
//        Glide.with(context).load(news.ImageUrl).into(holder.imageView);
        Picasso.with(context).load(news.ImageUrl).into(holder.imageView);
        holder.title.setText(news.title);
        holder.schoolAndTime.setText(news.schoolAndTime);
    }

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


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

解释

  • 具体的东西在代码中写的比较清楚了,这里解释一下不太容易理解的部分
  • getItemCount这个方法,如果有HeaderView的话,那么这个返回的子项数据就应该加一,因为要加上HeaderView,所以数量要加一

猜你喜欢

转载自blog.csdn.net/asffghfgfghfg1556/article/details/80037095