相对于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);