文章更新迁移到公众号
废话不多说,小猿,上代码
package git.dzc.library;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
/**
* Created by dzc on 15/10/9.
*/
public abstract class HeadFootAdapter<HeadViewHolder extends RecyclerView.ViewHolder,FootViewHolder extends RecyclerView.ViewHolder,ItemViewHolder extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//item的type 代表头部 中间 底部三个类型
static int TYPE_HEAD = 0;
static int TYPE_ITEM = 1;
static int TYPE_FOOT = 2;
/**
*头部ViewHolder
**/
public abstract HeadViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position);
public abstract ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int position);
public abstract FootViewHolder onCreateFooterViewHolder(ViewGroup parent, int position);
public abstract void onBindHeaderViewHolder(HeadViewHolder holder, int position);
public abstract void onBindItemViewHolder(ItemViewHolder holder, int position);
public abstract void onBindFooterViewHolder(FootViewHolder holder, int position);
/**
*根据viewType来创建不同的ViewHolder
**/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
switch (viewType){
case 0:
return onCreateHeaderViewHolder(viewGroup,viewType);
case 1:
return onCreateItemViewHolder(viewGroup, viewType);
default:
return onCreateFooterViewHolder(viewGroup,viewType);
}
}
/**
*根据ViewType绑定数据 这里重新计算了position,使每个部分的position都从0开始
**/
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
int headCount = getHeadViewCount();
int itemViewCount = getItemViewCount();
int itemType = getItemViewType(i);
switch (itemType){
case 0:
onBindHeaderViewHolder((HeadViewHolder) viewHolder,i);
break;
case 1:
onBindItemViewHolder((ItemViewHolder) viewHolder,i-headCount);
break;
case 2:
onBindFooterViewHolder((FootViewHolder) viewHolder,i-itemViewCount-headCount);
break;
}
}
/**
*adapter会调用这个方法来获取item的总数
*因为在这里 总数为上中下三部分数量加起来 不需要重写
*所以标志为final
*返回所有View的数量
**/
@Override
public final int getItemCount(){
return getHeadViewCount() + getFootViewCount() + getItemViewCount();
}
/**
*返回头部View的数量
**/
public abstract int getHeadViewCount();
/**
*返回底部View的数量
**/
public abstract int getFootViewCount();
/**
*返回中间View的数量
**/
public abstract int getItemViewCount();
/**
*这句话是关键 根据position来判断item的类型
*adapter会将此方法的返回值传入onCreateViewHolder
**/
@Override
public int getItemViewType(int position) {
// return super.getItemViewType(position);
int headCount = getHeadViewCount();
int itemCount = getItemViewCount();
if(position<headCount){
return TYPE_HEAD;
}
if(position>headCount+itemCount-1){
return TYPE_FOOT;
}
return TYPE_ITEM;
}
}
这里我把Adapter重新封装了一遍,实现了上中下三个部分的ViewHolder的创建和数据绑定,基本语法和原来普通的RecyclerView的Adapter一样,下面是demo代码,代码很简单,就不解释了,item里面就放了一个TextView
package git.dzc.head_foot_recycleview;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import git.dzc.library.HeadFootAdapter;
public class MainActivity extends AppCompatActivity {
private RecyclerView rv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv = (RecyclerView) findViewById(R.id.rv);
rv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
rv.setAdapter(new HeadFootAdapter<HeadViewHolder,FootViewHolder,ItemViewHolder>() {
@Override
public HeadViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position) {
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item2,parent,false);
return new HeadViewHolder(view);
}
@Override
public ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int position) {
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);
return new ItemViewHolder(view);
}
@Override
public FootViewHolder onCreateFooterViewHolder(ViewGroup parent, int position) {
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item2,parent,false);
return new FootViewHolder(view);
}
@Override
public void onBindHeaderViewHolder(HeadViewHolder holder, int position) {
holder.tv.setTextColor(Color.GREEN);
holder.tv.setTextSize(30);
holder.tv.setText("head "+position);
}
@Override
public void onBindItemViewHolder(ItemViewHolder holder, int position) {
holder.tv.setText("item "+position);
}
@Override
public void onBindFooterViewHolder(FootViewHolder holder, int position) {
holder.tv.setTextColor(Color.BLUE);
holder.tv.setTextSize(34);
holder.tv.setText("foot "+position);
}
@Override
public int getItemViewCount() {
return 10;
}
@Override
public int getHeadViewCount() {
return 7;
}
@Override
public int getFootViewCount() {
return 8;
}
});
}
class ItemViewHolder extends RecyclerView.ViewHolder{
public TextView tv;
public ItemViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv);
}
}
class HeadViewHolder extends RecyclerView.ViewHolder{
public TextView tv;
public HeadViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv);
}
}
class FootViewHolder extends RecyclerView.ViewHolder{
public TextView tv;
public FootViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv);
}
}
}
这是效果图