问题描述:在项目中要实现一个长按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上下文菜单注册
}
- 在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>
- 复写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. 再点击事件中,就可以执行你想做的操作啦