問題描述:在項(xiàng)目中要實(shí)現(xiàn)一個長按RecyclerView的子條目彈出上下文菜單,以便操作
效果圖:

效果圖
Log日志:

log日志
實(shí)現(xiàn)步驟:
1. 上下文菜單是長按彈出,那么肯定要先設(shè)置適配器的條目長按事件;在適配器的onBindViewHolder()方法中設(shè)置條目長按事件,在長按事件中獲取position并賦值
Kotlin:
//設(shè)置條目長按事件
itemView.setOnLongClickListener {
mPosition = holder.adapterPosition //將當(dāng)前position賦值保存
false
}
public var mPosition: Int = 0//此處要定義為公共類型,因?yàn)樵谕獠恳{(diào)用
Java:
//設(shè)置條目長按事件
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mPosition = holder.getAdapterPosition();//將當(dāng)前position賦值保存
return false;
}
});
private int mPosition;
2. 提供get()方法以便獲取賦值的position,因?yàn)镵otlin默認(rèn)生成變量的get()/set()方法,所以只需要將變量定義為公共類型即可,而Java則需要單獨(dú)提供get()方法
public int getPosition() {
return mPosition;
}
3. 在Activity中,給列表注冊上下文菜單,還有取消注冊(避免內(nèi)存泄漏)
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文件夾下創(chuàng)建菜單資源(menu文件夾需要自己創(chuàng)建哦)
<?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>
- 復(fù)寫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. 復(fù)寫onContextItemSelected()方法處理菜單條目點(diǎn)擊事件
Kotlin:
override fun onContextItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_delete -> {
Log.d(tag, "點(diǎn)擊了 ==> ${item.title} position is ==> ${mFruitsAdapter.mPosition}")
}
R.id.action_view_details -> {
Log.d(tag, "點(diǎn)擊了 ==> ${item.title} position is ==> ${mFruitsAdapter.mPosition}")
}
R.id.action_edit -> {
Log.d(tag, "點(diǎn)擊了 ==> ${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, "點(diǎn)擊了 ==>" + item.title);
Log.d(TAG, "position is ==>" + mFruitsAdapter.getPosition());
break;
case R.id.action_view_details :
Log.d(TAG, "點(diǎn)擊了 ==>" + item.title);
Log.d(TAG, "position is ==>" + mFruitsAdapter.getPosition());
break;
case R.id.action_edit:
Log.d(TAG, "點(diǎn)擊了 ==>" + item.title);
Log.d(TAG, "position is ==>" + mFruitsAdapter.getPosition());
break;
}
return true;
}
6. 再點(diǎn)擊事件中,就可以執(zhí)行你想做的操作啦