一.布局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);
}
}
}
四.效果展示图片:
五.项目案例下载地址:
https://download.csdn.net/download/dawnzeng/10610216