美文网首页
安卓学习笔记-----为RecyclerView添加Header

安卓学习笔记-----为RecyclerView添加Header

作者: 天青色等烟雨hhft | 来源:发表于2017-12-02 17:40 被阅读0次
    为RecyclerView添加header

    通过控制Adapter的itemType来设置,根据不同的itemType去加载不同的布局。
    重写了getItemViewType方法,并根据位置来返回不同的type,然后在onCreateViewHolder方法中来判断itemType,如果是header,则返回设置的headerView,否则正常加载item布局
    Adapter代码

    public class HeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
        public static final int TYPE_HEADER = 0;
        public static final int TYPE_NORMAL = 1;
        private ArrayList<String> mDatas = new ArrayList<>();
        private View mHeaderView;
        private OnItemClickListener mListener;
    
        public void setonItemClickListener(OnItemClickListener li) {
            mListener = li;
        }
    
        public void setHeaderView(View headerView) {
            mHeaderView = headerView;
            notifyItemInserted(0);
        }
    
        public View getHeaderView() {
            return mHeaderView;
        }
    
        public void addDatas(ArrayList<String> 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 layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
            return new Holder(layout);
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            if (getItemViewType(position) == TYPE_HEADER) {
                return;
            }
    
            final int pos = getRealPosition(holder);
            final String data = mDatas.get(pos);
            if (holder instanceof Holder) {
                ((Holder) holder).text.setText(data);
                if (mListener == null) {
                    return;
                }
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mListener.onItemClick(pos, data);
                    }
                });
            }
    
        }
    
        public int getRealPosition(RecyclerView.ViewHolder holder) {
            int position = holder.getPosition();
            return mHeaderView == null ? position : position - 1;
        }
    
        @Override
        public int getItemCount() {
            return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;
        }
    
    
        class Holder extends RecyclerView.ViewHolder {
            TextView text;
    
            public Holder(View itemView) {
                super(itemView);
                if (itemView == mHeaderView) {
                    return;
                }
                text = (TextView) itemView.findViewById(R.id.num);
            }
        }
    
        interface OnItemClickListener {
            void onItemClick(int position, String data);
        }
    }
    

    下面是MainActivity

    public class HeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
        public static final int TYPE_HEADER = 0;
        public static final int TYPE_NORMAL = 1;
        private ArrayList<String> mDatas = new ArrayList<>();
        private View mHeaderView;
        private OnItemClickListener mListener;
    
        public void setonItemClickListener(OnItemClickListener li) {
            mListener = li;
        }
    
        public void setHeaderView(View headerView) {
            mHeaderView = headerView;
            notifyItemInserted(0);
        }
    
        public View getHeaderView() {
            return mHeaderView;
        }
    
        public void addDatas(ArrayList<String> 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 layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
            return new Holder(layout);
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            if (getItemViewType(position) == TYPE_HEADER) {
                return;
            }
    
            final int pos = getRealPosition(holder);
            final String data = mDatas.get(pos);
            if (holder instanceof Holder) {
                ((Holder) holder).text.setText(data);
                if (mListener == null) {
                    return;
                }
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mListener.onItemClick(pos, data);
                    }
                });
            }
    
        }
    
        public int getRealPosition(RecyclerView.ViewHolder holder) {
            int position = holder.getPosition();
            return mHeaderView == null ? position : position - 1;
        }
    
        @Override
        public int getItemCount() {
            return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;
        }
    
    
        class Holder extends RecyclerView.ViewHolder {
            TextView text;
    
            public Holder(View itemView) {
                super(itemView);
                if (itemView == mHeaderView) {
                    return;
                }
                text = (TextView) itemView.findViewById(R.id.num);
            }
        }
    
        interface OnItemClickListener {
            void onItemClick(int position, String data);
        }
    }
    

    刚开始看着教程写的云里雾里的,写完之后看了一下讲解,然后又看了几遍代码才搞明白Adapter里是怎样设置的。

    相关文章

      网友评论

          本文标题:安卓学习笔记-----为RecyclerView添加Header

          本文链接:https://www.haomeiwen.com/subject/ogbnbxtx.html