相对于listview 可以有专门的api 添加headView 和FootView recycleview 需要动态的配置
package com.example.helloworld.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.example.helloworld.adapter.HeaderViewRecyclerAdapter;
import java.util.ArrayList;
public class WrapRecyclerView extends RecyclerView {
private ArrayList<View> mHeaderViewInfos = new ArrayList<View>();
private ArrayList<View> mFooterViewInfos = new ArrayList<View>();
private Adapter mAdapter;
public WrapRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public void addHeaderView(View view){
mHeaderViewInfos.add(view);
if (mAdapter!=null){
if (!(mAdapter instanceof HeaderViewRecyclerAdapter)){
mAdapter=new HeaderViewRecyclerAdapter(mHeaderViewInfos,mFooterViewInfos,mAdapter);
}
}
}
public void addFooterView(View view){
mFooterViewInfos.add(view);
if (mAdapter!=null){
if (!(mAdapter instanceof HeaderViewRecyclerAdapter)){
mAdapter=new HeaderViewRecyclerAdapter(mHeaderViewInfos,mFooterViewInfos,mAdapter);
}
}
}
@Override
public void setAdapter(@Nullable Adapter adapter) {
if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
mAdapter = new HeaderViewRecyclerAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
} else {
mAdapter = adapter;
}
super.setAdapter(mAdapter);
}
}
//华丽的分割线------------------------------------------------------------------------------
package com.example.helloworld.adapter;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class HeaderViewRecyclerAdapter extends RecyclerView.Adapter {
private RecyclerView.Adapter mAdapter;
ArrayList<View> mHeaderViewInfos;
ArrayList<View> mFooterViewInfos;
public HeaderViewRecyclerAdapter(ArrayList<View> headerViewInfos,
ArrayList<View> footerViewInfos, RecyclerView.Adapter adapter) {
mAdapter = adapter;
if (headerViewInfos == null) {
mHeaderViewInfos = new ArrayList<View>();
} else {
mHeaderViewInfos = headerViewInfos;
}
if (footerViewInfos == null) {
mFooterViewInfos = new ArrayList<View>();
} else {
mFooterViewInfos = footerViewInfos;
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
//header
if(viewType==RecyclerView.INVALID_TYPE){
return new HeaderViewHolder(mHeaderViewInfos.get(0));
}else if(viewType==RecyclerView.INVALID_TYPE-1){//footer
return new HeaderViewHolder(mFooterViewInfos.get(0));
}
// Footer (off-limits positions will throw an IndexOutOfBoundsException)
return mAdapter.onCreateViewHolder(viewGroup, viewType);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
//也要划分三个区域
int numHeaders = getHeadersCount();
if (position < numHeaders) {//是头部
return ;
}
//adapter body
final int adjPosition = position - numHeaders;
int adapterCount = 0;
if (mAdapter != null) {
adapterCount = mAdapter.getItemCount();
if (adjPosition < adapterCount) {
mAdapter.onBindViewHolder(viewHolder, adjPosition);
return ;
}
}
//footer
}
@Override
public int getItemCount() {
if (mAdapter!=null){
return mHeaderViewInfos.size()+mFooterViewInfos.size()+mAdapter.getItemCount();
}else {
return mHeaderViewInfos.size()+mFooterViewInfos.size();
}
}
@Override
public int getItemViewType(int position) {
//判断当前条目是什么类型的---决定渲染什么视图给什么数据
int numHeaders = getHeadersCount();
if (position < numHeaders) {//是头部
return RecyclerView.INVALID_TYPE;
}
//正常条目部分
// Adapter
final int adjPosition = position - numHeaders;
int adapterCount = 0;
if (mAdapter != null) {
adapterCount = mAdapter.getItemCount();
if (adjPosition < adapterCount) {
return mAdapter.getItemViewType(adjPosition);
}
}
//footer部分
return RecyclerView.INVALID_TYPE-1;
}
public int getHeadersCount() {
return mHeaderViewInfos.size();
}
public int getFootersCount() {
return mFooterViewInfos.size();
}
private static class HeaderViewHolder extends RecyclerView.ViewHolder {
public HeaderViewHolder(View view) {
super(view);
}
}
}
最后在activity调用:
TextView headerView = new TextView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
headerView.setLayoutParams(params);
headerView.setText("我是HeaderView");
rvView.addHeaderView(headerView);
TextView footerView = new TextView(this);
params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
footerView.setLayoutParams(params);
footerView.setText("我是FooterView");
rvView.addFooterView(footerView);
MyAdapter adapter = new MyAdapter(list);//MyAdapter 是自己定义的适配器 跟寻常一样定义就可以 这里不作展示
rvView.setLayoutManager(new LinearLayoutManager(this));
rvView.setAdapter(adapter);
本文介绍了一种在Android中使用自定义RecyclerView添加头布局和尾布局的方法。通过创建WrapRecyclerView类,可以动态地添加多个HeaderView和FooterView。此外,还提供了一个HeaderViewRecyclerAdapter来处理头尾布局的插入,确保了适配器的正常工作。

547

被折叠的 条评论
为什么被折叠?



