一.布局activity_add_header_or_footer.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" /> </LinearLayout>
二.界面代码:
public class AddHeaderOrFooterActivity extends AppCompatActivity { private RecyclerView recyclerView; private List<String> stringList; private AddHeadAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_header_or_footer); recyclerView = findViewById(R.id.recycler_view); stringList = new ArrayList<>(); for (int i = 0; i < 10; i++) { stringList.add("价格:" + i); } adapter = new AddHeadAdapter(this, stringList); adapter.setFooterView(LayoutInflater.from(this).inflate(R.layout.footer_view, null)); View header = LayoutInflater.from(this).inflate(R.layout.header_view, null); adapter.setHeaderView(header); adapter.setOnItemClickListener(new OnItemClickOrDeleteListener() { //Item单击 @Override public void onItemClick(int position) { Toast.makeText(AddHeaderOrFooterActivity.this, stringList.get(position - 1) + "-----position=" + position, Toast.LENGTH_SHORT).show(); } //Item删除 @Override public void onDeleteClick(int position) { Toast.makeText(AddHeaderOrFooterActivity.this, "onItemDelete position=" + position, Toast.LENGTH_SHORT).show(); // 移除数据 stringList.remove(position - 1); // 更新Adapter数据,一定要调用 notifyItemRangeChanged() 方法,否则角标会错乱 adapter.notifyItemRemoved(position); } //Item长按 @Override public void onLongClick(int position) { Toast.makeText(AddHeaderOrFooterActivity.this, stringList.get(position - 1) + "-----onLongClick position=" + position, Toast.LENGTH_SHORT).show(); } }); recyclerView.setLayoutManager(new GridLayoutManager(this, 1)); recyclerView.setAdapter(adapter); recyclerView.addItemDecoration(new GridDividerItemDecoration(1, 0)); } }
三.适配器代码:
public class AddHeadAdapter extends RecyclerView.Adapter<AddHeadAdapter.MyHolder> { public static final int TYPE_HEADER = 0; //说明是带有Header的 public static final int TYPE_FOOTER = 1; //说明是带有Footer的 public static final int TYPE_NORMAL = 2; //说明是不带有header和footer的 private View mHeaderView; private View mFooterView; private Context context; private List<String> stringList; private OnItemClickOrDeleteListener mListener; public void setOnItemClickListener(OnItemClickOrDeleteListener onItemClickListener) { this.mListener = onItemClickListener; } public AddHeadAdapter(Context context, List<String> stringList) { this.context = context; this.stringList = stringList; } public void setHeaderView(View headerView) { mHeaderView = headerView; notifyItemInserted(0); } public void setFooterView(View footerView) { mFooterView = footerView; notifyItemInserted(getItemCount() - 1); } /** * 重写这个方法,很重要,是加入Header和Footer的关键,我们通过判断item的类型,从而绑定不同的view */ @Override public int getItemViewType(int position) { if (mHeaderView == null && mFooterView == null) { return TYPE_NORMAL; } if (position == 0) { //第一个item应该加载Header return TYPE_HEADER; } if (position == getItemCount() - 1) { //最后一个,应该加载Footer return TYPE_FOOTER; } return TYPE_NORMAL; } @Override public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (mHeaderView != null && viewType == TYPE_HEADER) { return new MyHolder(mHeaderView); } if (mFooterView != null && viewType == TYPE_FOOTER) { return new MyHolder(mFooterView); } View view = LayoutInflater.from(context).inflate(R.layout.item_slide_delete, parent, false); return new MyHolder(view); } @Override public void onBindViewHolder(final MyHolder holder, final int position) { if (getItemViewType(position) == TYPE_NORMAL) { if (mListener != null) { holder.itemRlContent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onItemClick(holder.getAdapterPosition()); } }); holder.itemRlContent.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mListener.onLongClick(holder.getAdapterPosition()); return true; } }); holder.itemTextRemove.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //viewHolder.getAdapterPosition();获取位置;随着Item删除角标会错乱,该方法获取正确的item的位置(position) mListener.onDeleteClick(holder.getAdapterPosition()); } }); } holder.itemImageBook.setImageResource(R.mipmap.ic_launcher); holder.itemTextBookIsbn.setText(stringList.get(position - 1)); return; } else if (getItemViewType(position) == TYPE_HEADER) { return; } else { return; } } //返回View中Item的个数,这个时候,总的个数应该是ListView中Item的个数加上HeaderView和FooterView @Override public int getItemCount() { if (mHeaderView == null && mFooterView == null) { return stringList.size(); } else if (mHeaderView == null && mFooterView != null) { return stringList.size() + 1; } else if (mHeaderView != null && mFooterView == null) { return stringList.size() + 1; } else { return stringList.size() + 2; } } class MyHolder extends RecyclerView.ViewHolder { private ImageView itemImageBook; private TextView itemTextBookName; private RelativeLayout itemRlContent; private TextView itemTextBookIsbn; private TextView itemTextRemove; public MyHolder(View itemView) { super(itemView); itemImageBook = itemView.findViewById(R.id.item_image_book); itemTextBookName = itemView.findViewById(R.id.item_text_book_name); itemRlContent = itemView.findViewById(R.id.item_rl_content); itemTextBookIsbn = itemView.findViewById(R.id.item_text_book_isbn); itemTextRemove = itemView.findViewById(R.id.item_text_remove); } } }
四.效果展示图片:
五.项目案例下载地址: