recycleview的动态添加与删除

时间:2024-03-19 11:57:05

在学习完简单的recycleview后,我发现它还可以添加删除,特意在自己的工程中进行了实现

首先,recycleview控件存在与v7包中,我们在写代码前要导入依赖包:

compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support:recyclerview-v7:25.0.0'

再看一下它的重要代码:

del = (Button) findViewById(R.id.delitem);
add = (Button) findViewById(R.id.additem);
mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
//列表布局, 第一个参数表示上下文环境, 第二个参数表示水平布局,第三个参数表示是否反转;后两个参数可省略
//mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false));

//表格布局,第一个参数表示上下文,第二个参数表示表格有多少列
//mRecyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this, 3));

//瀑布布局,
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL));
isflow = true;

//添加分割线;列表布局设置DividerItemDecoration.HORIZONTAL;表格布局时设置DividerItemDecoration.VERTICAL//mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
//添加适配器
mRecyclerView.setAdapter(mAdapter = new HomeAdapter());
之后,我们就要开始动态添加删除了
这用到了recycleview 的监听时间和一个接口的回调
/**
 * 创建一个回调接口
 */
public interface MyItemClickListener {
    void onItemClick(View view, int position);
}
之后就是适配器的俄不同了
class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> {
    MyItemClickListener mItemClickListener;

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_home, parent, false);
        //将全局的监听传递给holder
        MyViewHolder holder = new MyViewHolder(view, mItemClickListener);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        //控件赋值
        holder.tv.setText(mDatas.get(position));
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }

    // 删除数据
    public void removeData(int position) {
        mDatas.remove(position);
        //删除动画
        notifyItemRemoved(position);
        notifyDataSetChanged();
    }

    // 添加数据
    public void addData(int position) {
        //   list中添加数据,并通知条目加入一条
        mDatas.add(position, "我是商品" + position);
        //添加动画
        notifyItemInserted(position);
    }

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private MyItemClickListener mListener;

        TextView tv;

        public MyViewHolder(View view, MyItemClickListener myItemClickListener) {
            super(view);
            tv = (TextView) view.findViewById(R.id.id_num);
这是对瀑布流时随机高度的一个生成,为了判断是否为瀑布流特地设置了布尔值isflow;
 if (isflow) {
                ViewGroup.LayoutParams lp = tv.getLayoutParams();
                lp.height = (int) (Math.random() * 300 + 100);
                tv.setLayoutParams(lp);
                isflow = false;
            }

            //将全局的监听赋值给接口
            this.mListener = myItemClickListener;
            itemView.setOnClickListener(this);

        }

        @Override
        public void onClick(View view) {
            if (mListener != null) {
                mListener.onItemClick(view, getPosition());
            }
        }

    }

    public void setItemClickListener(MyItemClickListener myItemClickListener) {
        this.mItemClickListener = myItemClickListener;
    }
}
当然除了接口回调,下面这俩个方法也很重要

    // 删除数据
    public void removeData(int position) {
        mDatas.remove(position);
        //删除动画
        notifyItemRemoved(position);
        notifyDataSetChanged();
    }

    // 添加数据
    public void addData(int position) {
        //   list中添加数据,并通知条目加入一条
        mDatas.add(position, "我是商品" + position);
        //添加动画
        notifyItemInserted(position);
    }

效果如下图recycleview的动态添加与删除