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);
        }
    }
}

四.效果展示图片:

五.项目案例下载地址:

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView添加尾部布局的一种常见方式是使用 RecyclerView.Adapter 中的 getItemViewType() 方法。我们可以在这个方法中判断当前位置是否为最后一个位置,如果是,则返回一个特殊的 ViewType,表示这个位置需要显示尾部布局。然后在 onCreateViewHolder() 方法中,根据 ViewType 创建相应的 ViewHolder。 具体步骤如下: 1. 在 RecyclerView.Adapter 中定义一个常量,表示尾部布局的 ViewType。例如: ```java private static final int VIEW_TYPE_FOOTER = 1; ``` 2. 在 getItemViewType() 方法中,判断当前位置是否为最后一个位置,如果是,则返回 VIEW_TYPE_FOOTER,否则返回默认的 ViewType。例如: ```java @Override public int getItemViewType(int position) { if (position == getItemCount() - 1) { return VIEW_TYPE_FOOTER; } else { return super.getItemViewType(position); } } ``` 3. 在 onCreateViewHolder() 方法中,根据 ViewType 创建相应的 ViewHolder。例如: ```java @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == VIEW_TYPE_FOOTER) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.footer_layout, parent, false); return new FooterViewHolder(view); } else { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ItemViewHolder(view); } } ``` 这段代码会先判断 viewType 是否为 VIEW_TYPE_FOOTER,如果是,则将名为 footer_layout 的布局文件转换成一个 View 对象,并创建一个 FooterViewHolder 对象;否则将名为 item_layout 的布局文件转换成一个 View 对象,并创建一个 ItemViewHolder 对象。 4. 在 getItemCount() 方法中,将尾部布局的数量加上原有的元素数量。例如: ```java @Override public int getItemCount() { return itemList.size() + 1; // 加 1 表示尾部布局 } ``` 这样,RecyclerView 会在显示列表的最后一个位置添加一个尾部布局。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值