Activity:
1:初始化控件
@BindView(R.id.recyclerviewhead)
public RecyclerView recyclerviewhead;
public ArrayList<String> data ;
public MyRecycleViewAdapter adapter;
:添加数据
ButterKnife.bind(this);
/**
* 模拟数据
* */
data =new ArrayList<>();
for (int i = 0; i < 100; i++) {
data.add("数据"+i);
}
3:设置方向
LinearLayoutManager linearLayoutManager =new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerviewhead.setLayoutManager(linearLayoutManager);
4:adapter处理
adapter =new MyRecycleViewAdapter(data,this);
/**
* 添加头布局
* */
adapter.addHeadView(View.inflate(getApplicationContext(),R.layout.header,null));
/**
* 添加底布局
* */
adapter.addFootView(View.inflate(getApplicationContext(),R.layout.footer,null));
recyclerviewhead.setAdapter(adapter);
adapter.notifyDataSetChanged();
/**
* 分割线
* */
recyclerviewhead.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
/**
* 监听事件
* */
adapter.setOnItenClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(MainRecycleViewActivity.this, "点击了"+position, Toast.LENGTH_SHORT).show();
}
@Override
public void onLongItemClick(View view, int position) {
Toast.makeText(MainRecycleViewActivity.this, "长按了"+position, Toast.LENGTH_SHORT).show();
}
});
Adapter :
1:继承 extends RecyclerView.Adapter<RecyclerView.ViewHolder>
2:添加布局判断
/**
* 头布局
*/
public static final int HEADVIEW = 3;
//创建一个头布局的View
public View ViewHead;
public static int headViewSize =0;
/**
* 底布局
*/
public static final int FOOTVIEW = 4;
//创建一个头布局的View
public View ViewFoot;
public static int footViewSize =0;
/**
* 多布局
*/
public static final int TYPE_GROUP = 1;
public static final int TYPE_CHILD = 2;
3:区分那个布局
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
RecyclerView.ViewHolder holder = null;
switch (viewType) {
case 1:
View view1 = inflater.inflate(R.layout.test_group_item, null);
holder = new MyGroupHolder(view1);
break;
case 2:
View view2 = inflater.inflate(R.layout.test_child_item, null);
holder = new MyChildHolder(view2);
break;
case 3:
//头布局
holder = new MyHeadViewHolder(ViewHead);
break;
case 4:
//底布局
holder = new MyFootViewHolder(ViewFoot);
break;
}
return holder;
}
4:绑定数据
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
/**
* 判断该位置是头布局还是底布局
* */
if (!isAddHeadView(position)&& !isAddFootView(position)) {
if(ViewHead!=null){
/**
* 头布局的时候,这里要减1不然要越界
* */
position--;
}
if (holder instanceof MyGroupHolder) {
((MyGroupHolder) holder).tv_group_name.setText(data.get(position));
} else if (holder instanceof MyChildHolder) {
((MyChildHolder) holder).tv_child_name.setText(data.get(position));
}
}
View itemview = ((RelativeLayout) (holder.itemView)).getChildAt(0);
if (onItemClickListener != null) {
itemview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = holder.getLayoutPosition();
onItemClickListener.onItemClick(holder.itemView, position);
}
});
}
//长按点击
if (onLongItemClickListener != null) {
itemview.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
int position = holder.getLayoutPosition();
onLongItemClickListener.onLongItemClick(holder.itemView, position);
return true;
}
});
}
}
5:item个数
@Override
public int getItemCount() {
Log.e("wudi", "getItemCount: "+(data.size()+headViewSize+footViewSize ));
return (data.size()+headViewSize+footViewSize);
}
6:多布局区分类型
@Override
public int getItemViewType(int position) {
if (isAddHeadView(position)) {
return HEADVIEW;
} else if (isAddFootView(position)) {
return FOOTVIEW;
} else {
if (position > 0 && position < data.size()+headViewSize+footViewSize && position % 2 == 0) {
return TYPE_CHILD;
} else {
return TYPE_GROUP;
}
}
}
7:添加头布局,底布局
/**
* 头布局
*/
public void addHeadView(View headView) {
ViewHead = headView;
headViewSize =1;
}
/**
* 底布局
*/
public void addFootView(View footView) {
ViewFoot = footView;
footViewSize =1;
}
/**
* 是否添加了头布局
*/
public boolean isAddHeadView(int position) {
//第一个布局是头布局
return ViewHead != null && position == 0;
}
/**
* 是否添加了底布局
*/
public boolean isAddFootView(int position) {
//最后一个item 是底布局
return ViewFoot != null && position == (data.size()+headViewSize+footViewSize-1);
}
8: 数据布局
/**
* 正常布局2
*/
public static class MyGroupHolder extends RecyclerView.ViewHolder {
@BindView(R.id.tv_group_name)
public TextView tv_group_name;
public MyGroupHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
/**
* 正常布局 1
*/
public static class MyChildHolder extends RecyclerView.ViewHolder {
@BindView(R.id.tv_child_name)
public TextView tv_child_name;
public MyChildHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
9:监听事件
//点击监听
private OnItemClickListener onItemClickListener;
//长按监听
private OnItemClickListener onLongItemClickListener;
public void setOnItenClickListener(OnItemClickListener listener) {
onItemClickListener = listener;
onLongItemClickListener = listener;
}
Interface:
//接口回调
public interface OnItemClickListener {
/**
* 定义点击事件接口
* */
void onItemClick(View view, int position);
/**
* 定义长按点击事件
* */
void onLongItemClick(View view, int position);
}