【问题标题】:Switching to a fragment on click from the adapter [duplicate]从适配器单击切换到片段[重复]
【发布时间】:2021-03-26 03:50:39
【问题描述】:

我在项目中有一个 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 in 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()。如何解决?

【问题讨论】:

    标签: java android adapter android-context


    【解决方案1】:

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

    对于一个带有回调的例子,我们可以定义一个接口:

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

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

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

    【讨论】:

    • 你能用callback描述一个方法或者举一些例子吗?
    • 增加了一些清晰度
    【解决方案2】:

    您可以从 ViewHolder 中获取上下文

    holder.itemView.getContext()
    

    但是真的不推荐

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

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      相关资源
      最近更新 更多