Android开发——给RecyclerView设置上下文菜单

问题描述:在项目中要实现一个长按RecyclerView的子条目弹出上下文菜单,以便操作

效果图:

效果图

Log日志:

log日志

实现步骤:

1. 上下文菜单是长按弹出,那么肯定要先设置适配器的条目长按事件;在适配器的onBindViewHolder()方法中设置条目长按事件,在长按事件中获取position并赋值

Kotlin:


//设置条目长按事件

itemView.setOnLongClickListener {

    mPosition = holder.adapterPosition //将当前position赋值保存

    false

}


public var mPosition: Int = 0//此处要定义为公共类型,因为在外部要调用

Java:


//设置条目长按事件

holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {

    @Override

    public boolean onLongClick(View v) {

        mPosition = holder.getAdapterPosition();//将当前position赋值保存

        return false;

}

});


private int mPosition;

2. 提供get()方法以便获取赋值的position,因为Kotlin默认生成变量的get()/set()方法,所以只需要将变量定义为公共类型即可,而Java则需要单独提供get()方法


public int getPosition() {

    return mPosition;

}

3. 在Activity中,给列表注册上下文菜单,还有取消注册(避免内存泄漏)

Kotlin:


override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_main)

    ...

    registerForContextMenu(RecyclerView的id)//注册 上下文菜单

}


override fun onDestroy() {

    super.onDestroy()

    unregisterForContextMenu(RecyclerView的id)//取消RecyclerView上下文菜单注册

}

Java:


@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    ...

    registerForContextMenu(RecyclerView的id);//注册 上下文菜单

}


@Override

protected void onDestroy() {

    super.onDestroy();

    unregisterForContextMenu(RecyclerView的id);//取消RecyclerView上下文菜单注册

}

  1. 在res\menu文件夹下创建菜单资源(menu文件夹需要自己创建哦)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_delete"
        android:title="删除"/>

    <item android:id="@+id/action_view_details"
        android:title="查看详情"/>

    <item android:id="@+id/action_edit"
        android:title="编辑"/>
</menu>
  1. 复写onCreateContextMenu()方法,加载菜单资源

Kotlin:


override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {

    super.onCreateContextMenu(menu, v, menuInfo)

    //加载菜单资源

    menuInflater.inflate(R.menu.menu_fruis_context, menu);

}

Java:


@Override

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {

    super.onCreateContextMenu(menu, v, menuInfo);

    //加载菜单资源

    this.getMenuInflater().inflate(R.menu.menu_fruis_context, menu);

}

5. 复写onContextItemSelected()方法处理菜单条目点击事件

Kotlin:


override fun onContextItemSelected(item: MenuItem): Boolean {

    when (item.itemId) {

        R.id.action_delete -> {

            Log.d(tag, "点击了 ==> ${item.title} position is ==> ${mFruitsAdapter.mPosition}")

}

        R.id.action_view_details -> {

            Log.d(tag, "点击了 ==> ${item.title} position is ==> ${mFruitsAdapter.mPosition}")

}

        R.id.action_edit -> {

            Log.d(tag, "点击了 ==> ${item.title} position is ==> ${mFruitsAdapter.mPosition}")

}

}

    return true

}

Java:


@Override

public boolean onContextItemSelected(@NonNull MenuItem item) {

    switch (item.getItemId()) {

        case R.id.action_delete:

            Log.d(TAG, "点击了 ==>"  + item.title);

            Log.d(TAG, "position is ==>"  + mFruitsAdapter.getPosition());

            break;

        case R.id.action_view_details :

            Log.d(TAG, "点击了 ==>"  + item.title);

            Log.d(TAG, "position is ==>"  + mFruitsAdapter.getPosition());

            break;

        case R.id.action_edit:

            Log.d(TAG, "点击了 ==>"  + item.title);

            Log.d(TAG, "position is ==>"  + mFruitsAdapter.getPosition());

            break;

}

    return true;

}

6. 再点击事件中,就可以执行你想做的操作啦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。