从适配器单击时切换到片段

问题描述

我在项目中有一个 BackStack,为了从片段到片段的转换,我使用以下内容

 public void showFragment(@NonNull Fragment fragment) {
        showFragment(fragment,true);
    }

    public void showFragment(@NonNull Fragment fragment,boolean addToBackStack) {
        if (curFragment != null && addToBackStack) {
            pushFragmentToBackStack(curTabId,curFragment);
        }
        replaceFragment(fragment);
    }
 private void replaceFragment(@NonNull Fragment fragment) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction tr = fm.beginTransaction();
        tr.replace(R.id.content,fragment);
        tr.commitAllowingStateLoss();
        curFragment = fragment;
    }

但我需要通过单击 recyclerView 中的项目进入片段,为此,我为每个 item 添加一个位置。 onBindViewHolder 中的 Adapter 添加了这个

 @Override
    public void onBindViewHolder(MenuViewHolder holder,int position) {
        Itemmenu Item = ItemmenuList.get(position);

        holder.tv_menu.setText(Item.getMenuText());

        holder.getAdapterPosition();

        holder.cv_menu.setonClickListener(v ->
        {
            switch (Item.getinitialPositon()) {
                case 0: {
                    ((MainActivity) requireActivity()).showFragment(Fragment_Tasks.newInstance());
                    break;
                }
                case 1: {

                    break;
                }
            }
        });
    }

问题是转换需要context()。如何解决

解决方法

您可以将 Context 引用传递到您的适配器或回调,您可以使用它来将点击处理工作传递给活动/片段。

以回调为例,我们可以定义一个接口:

interface OnItemClickListener {
     void onItemClick(...);
}

通过构造函数将其传递给适配器,然后在您的项目被点击时触发它。所以在onBindViewHolder

holder.cvMenu.setOnClickListener(v -> {
    itemClickListener.onItemClick(...);
});
,

您可以从 ViewHolder 获取上下文

holder.itemView.getContext()

但是真的不推荐

最佳做法是在适配器中为 onclick 添加接口,然后将其实现到您的片段中