Android開發(fā)——給RecyclerView設(shè)置上下文菜單

問題描述:在項(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上下文菜單注冊

}

  1. 在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>
  1. 復(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í)行你想做的操作啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容