RecyclerView之添加头部、尾部和左滑显示删除按钮并删除Item

一.布局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);
        }
    }
}

四.效果展示图片:

RecyclerView之添加头部、尾部和左滑显示删除按钮并删除Item

五.项目案例下载地址:

https://download.csdn.net/download/dawnzeng/10610216