RecyclerView添加长按的两种方式-代码案例

第一种 添加Menu的方式

从RecyclerView的Adapter入手,在Adapter的ViewHolder中为每个itemView设置setOnLongClickListener监听,然后在长按监听回调中设置当前的position,为每个itemView设置setOnCreateContextMenuListener监听,通过上面记录的position来执行相应的动作。

在adapter中添加系列方法,Activity中只需要重载onContextItemSelected(MenuItem item)就行了

public class MainActivity extends AppCompatActivity {
    private BiJiAdapter adapter;
    private BiJiDAO dao;
    private List<BiJiBean> data;
    private RecyclerView mRecyclerView;
    private int position;


    public class BiJiAdapter extends RecyclerView.Adapter<BiJiAdapter.ViewHolder>  {

        private int adapterPosition;

        public void setContextMenuPosition(int position) {
            adapterPosition = position;
        }

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

        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, null);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.mTextView.setText(new StringBuilder(String.valueOf(position))
                    .append(". ")
                    .append(((BiJiBean) MainActivity.this.data.get(position)).getInfo())
                    .toString());
            //设置长按监听
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {

                @Override
                public boolean onLongClick(View v) {
                    //保存当前 item 的 position
                    setContextMenuPosition(holder.getLayoutPosition());
                    Log.d("lixiongjun","onLongClick");
                    Log.d("lixiongjun","holder.getLayoutPosition():" + holder.getLayoutPosition());
                    return false;
                }
            });
        }

        //在 onViewRecycled 方法中移除 OnLongClickListener 监听
        @Override
        public void onViewRecycled(ViewHolder holder) {
            holder.itemView.setOnLongClickListener(null);
            Log.d("lixiongjun","onViewRecycled");
            super.onViewRecycled(holder);
        }


        // 长按,实现OnCreateContextMenuListener
        class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {

            private TextView mTextView;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                mTextView = itemView.findViewById(android.R.id.text1);
                itemView.setOnCreateContextMenuListener(this);
            }

            //添加长按的Menu
            @Override
            public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
                menu.setHeaderTitle("我的笔记呀");
                menu.add(0, 1, 0, "更新");
                menu.add(0, 2, 0, "删除");
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Window window = getWindow();
        window.requestFeature(Window.FEATURE_LEFT_ICON);
        setContentView(R.layout.activity_main);
        window.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_launcher_background);


        mRecyclerView = findViewById(R.id.recycler);
        DividerItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
        //设置RecyclerView 灰色 分割线
//        itemDecoration.setDrawable(new ColorDrawable(ContextCompat.getColor(this, R.color.black)));
        //添加drawable,设置彩色分割线
        itemDecoration.setDrawable(ContextCompat.getDrawable(this, R.drawable.shape_rectangle));
        mRecyclerView.addItemDecoration(itemDecoration);
        this.dao = new BiJiDAO(this);
        this.data = this.dao.queryAll();
        this.adapter = new BiJiAdapter();
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(this.adapter);
    }


    //重现,长按监听的接口方法
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        Log.d("lixiongjun","onContextItemSelected");
        BiJiBean biJiBean = (BiJiBean) this.data.get(position);
        switch (item.getItemId()) {
            case 1:
                showUpdateDialog(biJiBean);
                break;
            case 2:
                this.dao.deleteById(biJiBean.getId());
                this.data.remove(this.position);
                this.adapter.notifyDataSetChanged();
                break;
        }
        return super.onContextItemSelected(item);
    }

    /**
     * 跟recyclerView长按无关
     * 更新Dialog
     *
     * @param biJiBean
     */
    private void showUpdateDialog(final BiJiBean biJiBean) {
        final EditText editText = new EditText(this);
        editText.setText(biJiBean.getInfo());
        new AlertDialog.Builder(this)
                .setTitle("更新笔记")
                .setView(editText)
                .setPositiveButton("更新", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        biJiBean.setInfo(editText.getText().toString());
                        MainActivity.this.dao.update(biJiBean);
                        MainActivity.this.adapter.notifyDataSetChanged();
                    }
                }).setNegativeButton("取消", null).show();
    }

    /**
     * 跟recyclerView长按无关
     * 添加笔记Dialog
     * @param v
     */
    public void add(View v) {
        final EditText editText = new EditText(this);
        editText.setHint("笔记输入");
        new AlertDialog.Builder(this)
                .setTitle("添加笔记")
                .setView(editText)
                .setPositiveButton("添加", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        BiJiBean biJiBean = new BiJiBean(-1, editText.getText().toString());
                        MainActivity.this.dao.add(biJiBean);
                        MainActivity.this.data.add(0, biJiBean);
                        MainActivity.this.adapter.notifyDataSetChanged();
                    }
                }).setNegativeButton("取消", null).show();
    }
}

第二种 RecyclerView设置监听回调方式

在Adapter中写一个item的点击事件接口,Adapter中设置该接口,并给其一个set方法.Adapter类实现 View.OnClickListener, View.OnLongClickListener接口,并实现其方法。实现接口的方法中,回调item的点击事件接口,在Activity中调用方法.

public class MainActivity extends AppCompatActivity {
    private BiJiAdapter adapter;
    private BiJiDAO dao;
    private List<BiJiBean> data;
    private RecyclerView mRecyclerView;
    private int position;


    public class BiJiAdapter extends RecyclerView.Adapter<BiJiAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener {

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

        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, null);
            ViewHolder holder = new ViewHolder(view);
//            view.setTag(android.R.id.text1, holder);//注意这里,对应values/ids.xml里的value
            view.setTag(1111111111, holder);//注意这里,对应values/ids.xml里的value
            view.setOnClickListener(this);
            view.setOnLongClickListener(this);
            return holder;
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.mTextView.setText(new StringBuilder(String.valueOf(position))
                    .append(". ")
                    .append(((BiJiBean) MainActivity.this.data.get(position)).getInfo())
                    .toString());
        }

        class ViewHolder extends RecyclerView.ViewHolder {

            private TextView mTextView;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                mTextView = itemView.findViewById(android.R.id.text1);
            }
        }


        @Override
        public void onClick(View view) {
            //回调点击事件
            ViewHolder holder = (ViewHolder) view.getTag(1111111111);
            if (mOnItemClickListener != null) {
                this.mOnItemClickListener.onItemClick(view, holder.getAdapterPosition());
            }
        }

        @Override
        public boolean onLongClick(View view) {
            //回调长按事件
            ViewHolder holder = (ViewHolder) view.getTag(1111111111);
            if (mOnItemClickListener != null) {
                this.mOnItemClickListener.onItemLongClick(view, holder.getAdapterPosition());
            }
            return false;
        }

        private OnItemClickListener mOnItemClickListener;

        public void setOnItemClickListener(OnItemClickListener mOnItemClickLitener) {
            this.mOnItemClickListener = mOnItemClickLitener;
        }


    }

    //自定义点击接口类
    public interface OnItemClickListener {
        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Window window = getWindow();
        window.requestFeature(Window.FEATURE_LEFT_ICON);
        setContentView(R.layout.activity_main);
        window.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_launcher_background);


        mRecyclerView = findViewById(R.id.recycler);
        DividerItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
        //设置灰色 分割线
//        itemDecoration.setDrawable(new ColorDrawable(ContextCompat.getColor(this, R.color.black)));
        //设置彩色
        itemDecoration.setDrawable(ContextCompat.getDrawable(this, R.drawable.shape_rectangle));
        mRecyclerView.addItemDecoration(itemDecoration);
        this.dao = new BiJiDAO(this);
        this.data = this.dao.queryAll();
        this.adapter = new BiJiAdapter();
        adapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                //单击事件
                Toast.makeText(MainActivity.this, "点击item", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onItemLongClick(View view, final int position) {
                //长按事件,弹窗
                BiJiBean biJiBean = data.get(position);
                final String[] items = {"更新", "删除"};
                android.app.AlertDialog.Builder listDialog = new android.app.AlertDialog.Builder(MainActivity.this);
                listDialog.setItems(items, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        switch (i) {
                            case 0://更新item
                                showUpdateDialog(biJiBean);
                                break;
                            case 1://删除item
                                dao.deleteById(biJiBean.getId());
                                data.remove(position);
                                adapter.notifyDataSetChanged();
                                break;
                            default:
                                break;
                        }
                    }
                });
                listDialog.show();
            }
        });

        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(this.adapter);
    }



    private void showUpdateDialog(final BiJiBean biJiBean) {
        final EditText editText = new EditText(this);
        editText.setText(biJiBean.getInfo());
        new AlertDialog.Builder(this)
                .setTitle("更新笔记")
                .setView(editText)
                .setPositiveButton("更新", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        biJiBean.setInfo(editText.getText().toString());
                        MainActivity.this.dao.update(biJiBean);
                        MainActivity.this.adapter.notifyDataSetChanged();
                    }
                }).setNegativeButton("取消", null).show();
    }

    public void add(View v) {
        final EditText editText = new EditText(this);
        editText.setHint("笔记输入");
        new AlertDialog.Builder(this)
                .setTitle("添加笔记")
                .setView(editText)
                .setPositiveButton("添加", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        BiJiBean biJiBean = new BiJiBean(-1, editText.getText().toString());
                        MainActivity.this.dao.add(biJiBean);
                        MainActivity.this.data.add(0, biJiBean);
                        MainActivity.this.adapter.notifyDataSetChanged();
                    }
                }).setNegativeButton("取消", null).show();
    }
}

参考: ​RecyclerView添加ContextMenu的两种方案详解.
参考: ​Android中RecyclerView的长按.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView中,要实现按删除功能,需要以下步骤: 1. 在RecyclerView的适配器中,实现按事件监听接口OnItemLongClickListener,代码如下: ``` public interface OnItemLongClickListener { void onItemLongClick(View view, int position); } private OnItemLongClickListener mOnItemLongClickListener; public void setOnItemLongClickListener(OnItemLongClickListener listener) { this.mOnItemLongClickListener = listener; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout, parent, false); final MyViewHolder viewHolder = new MyViewHolder(itemView); itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (mOnItemLongClickListener != null) { mOnItemLongClickListener.onItemLongClick(v, viewHolder.getAdapterPosition()); } return true; } }); return viewHolder; } ``` 2. 在RecyclerView的Activity或Fragment中,实现OnItemLongClickListener接口,并在onCreate方法中设置适配器的按监听器,代码如下: ``` mRecyclerView.setAdapter(mAdapter); mAdapter.setOnItemLongClickListener(new MyAdapter.OnItemLongClickListener() { @Override public void onItemLongClick(View view, int position) { // 在此处处理按删除操作 mAdapter.removeItem(position); } }); ``` 3. 在适配器中添加删除数据的方法removeItem(int position),代码如下: ``` public void removeItem(int position) { mDatas.remove(position); notifyItemRemoved(position); } ``` 这样,当用户按某个RecyclerView的item时,就会弹出删除确认框,用户确认后,该item就会被删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值