RecyclerView使用上下文菜單

效果圖

效果圖
  1. 布局文件中只包含RecyclerView
  2. MainActivity中代碼如下:
public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerview;

    private MyAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerview = findViewById(R.id.recyclerview);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerview.setLayoutManager(linearLayoutManager);
        recyclerview.setAdapter(mAdapter = new MyAdapter());
        recyclerview.addItemDecoration(new DividerItemDecoration(this, OrientationHelper.VERTICAL));
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        mAdapter.removeItem(mAdapter.getPosition());
        return super.onContextItemSelected(item);
    }
}
  1. Adapter代碼
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private List<String> mData = new ArrayList<>();

    private int mPosition = -1;

    public int getPosition() {
        return mPosition;
    }

    public void setPosition(int position) {
        this.mPosition = position;
    }

    public void removeItem(int position) {
        mData.remove(position);
        notifyDataSetChanged();
    }

    public MyAdapter() {
        String data;
        for (int i = 0; i < 100; i++) {
            data = "item_" + i;
            mData.add(data);
        }
    }

    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        TextView tv = new TextView(parent.getContext());
        tv.setTextSize(20);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(-1, -2);
        tv.setLayoutParams(lp);
        return new MyAdapter.MyViewHolder(tv);
    }

    @Override
    public void onBindViewHolder(final MyAdapter.MyViewHolder holder, final int position) {
        holder.tv.setText(mData.get(position));
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                mPosition = holder.getAdapterPosition();
                return false;
            }
        });
    }

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

    static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {

        TextView tv;

        public MyViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView;
            itemView.setOnCreateContextMenuListener(this);
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            menu.add(0, 0, 0, "刪除");
        }
    }
}

注意點(diǎn):
: 1.在ViewHolder中添加itemView.setOnCreateContextMenuListener(this);
: 2.在ViewHolder中重寫(xiě)onCreateContextMenu添加菜單
: 3.在adapter中定義一個(gè)屬性mPosition記錄當(dāng)前長(zhǎng)按點(diǎn)擊的位置
: 4.在onBindViewHolder中為itemView設(shè)置onLongClick事件
: holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mPosition = holder.getAdapterPosition(); return false; } });
: 5.在Activity中重寫(xiě)onContextItemSelected方法實(shí)現(xiàn)上下文點(diǎn)擊的操作。

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

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