第一次写博客,谈谈对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这里一定要判断是不是头