Bootstrap

RecyclerView头布局添加

第一次写博客,谈谈对RecyclerView头布局的理解。

           RecyclerView是没有直接添加头布局的,但是他提供一个方法getItemViewType(int position)这个方法是在onCreateViewHolder之前执行的。

直接进入主题:

为了大家看的更清楚,我直接把代码写activity里边。

MyAdapter继承RecyclerView.Adapter,然后重写里边的三个方法,然后在重写一个getItemViewType,全部代码如下:

public class MainActivity extends AppCompatActivity {

    private RecyclerView viewById;
    private ArrayList<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewById = (RecyclerView) findViewById(R.id.rv_test);
         viewById.setLayoutManager(new LinearLayoutManager(this));
        list = new ArrayList<>();
        //添加数据
        for(int i ='A';i<200;i++){
            list.add(String.valueOf((char)i));
        }
        MyAdapter myAdapter = new MyAdapter();
        //需要头布局就在这里调用addHeadView
        myAdapter.addHeadView(View.inflate(getApplicationContext(),R.layout.item_head,null));
        viewById.setAdapter(myAdapter);


    }

    class MyAdapter extends RecyclerView.Adapter<MyViewHolder>{
        //创建两个字段
        public final  static int TYPE_HEAD =0;
        public final  static int TYPE_NORMAL  =1;
        //创建一个头布局的View
        public View Viewhead;
        @Override
        public int getItemViewType(int position) {
            //如果Viewhead!=null 且position等于0就返回TYPE_HEAD,
            if(isHeadState(position)){
                return TYPE_HEAD;
            }else{
                return TYPE_NORMAL ;
            }
        }
        //创建一个方法来设置头布局
        public  void addHeadView(View headview){
            Viewhead = headview;
        }
        //用一个方法来判断是不是创建了头布局
        public boolean isHeadState(int position){
            return Viewhead!=null&&position==0;
        }

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            MyViewHolder holder;
            //刚刚getItemViewType里返回的值就是这里的viewType
            if(viewType==TYPE_HEAD){
                //如果返回来的是TYPE_HEAD就创建头
                holder = new MyViewHolder(Viewhead);

            }else{
                View view = View.inflate(getApplicationContext(), R.layout.item_normal, null);
                holder = new MyViewHolder(view);
            }
            return holder;
        }

        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            //这里判断是不是头布局,是的话就设置内容
            if(!isHeadState(position)){
                //这里要减1不然要越界
               if(Viewhead!=null){
                   position--;
               }
                holder.tv_title.setText(list.get(position));
            }

        }
    //这里的设置也是关键,不然看不到完整的条目
        @Override
        public int getItemCount() {

            return Viewhead==null?list.size():list.size()+1;
        }
    }
    class MyViewHolder extends RecyclerView.ViewHolder {

        public   TextView tv_title;

        public MyViewHolder(View itemView) {
            super(itemView);
            tv_title = (TextView) itemView.findViewById(R.id.tv_title);
        }
    }


}
主要是在 getItemCount()那里的值要设好,还有就是 onBindViewHolder这里一定要判断是不是头
	
 



;