【问题标题】:Imitate 'onActivityResult' inside an Adapter of RecyclerView在 RecyclerView 的 Adapter 中模仿“onActivityResult”
【发布时间】:2019-05-04 08:52:44
【问题描述】:

我有一个 RecyclerView,其中项目包含一个使用 startActivityForResult 启动活动的按钮。 onClick 方法是在适配器内部实现的,并且在从新活动返回时,不会调用包含 RecyclerView 的片段的 onActivityResult。据我所知,这是意料之中的,因为 startActivityForResult 不是从此片段中调用的。

我找到的最接近解决方案的是: onActivityResult inside a RecyclerView.Adapter not being used

但是在尝试使用接口实现onClick方法时,我现在面临一个新问题:我不能在适配器内部调用onClick方法,虽然它是在活动内部实现的,因为适配器的上下文是静态的,并且该方法是非静态的。

以下是一些代码部分,可以更好地解释当前情况。我迫切需要一个替代解决方案,我真的一直在寻找。谢谢。

片段实现接口:

public class EditableOffersListFragment extends Fragment implements OnClickButtonListener { ...

    @Override
    public void onClickButton(View v, int position, ArrayList<Offer> offers) {
        Offer from_item = offers.get(position);

        Intent intent = new Intent(getActivity(), OfferDetailsPopupActivity.class);
        intent.putExtra("new", false);
        intent.putExtra("offer_fromRecycler", from_item);
        getActivity().startActivityForResult(intent, HTZ_ADD_OFFER);
    }
...}

界面(在单独的文件中):

public interface OnClickButtonListener {
    void onClickButton(View v, int position, ArrayList<Offer> offers);
}

在适配器内部:

            mEditOfferButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    OnClickButtonListener.onClickButton(v, getAdapterPosition(), mOffers);
                }
            });

【问题讨论】:

  • 如果您从getActivity() 方法调用startActivityForResult,那么回调onActivityResult 将由持有该片段的Activity 处理。如果您改为使用this.startActivityForResultthis 对片段的引用),则回调将由实际启动活动的片段处理。

标签: java android android-recyclerview


【解决方案1】:

我认为您当前面临的问题是您从包含当前片段而不是片段本身的 Activity 调用 startActivityForResult。因此,使用this 或直接调用startActivityForResult 将从片段而不是Activity 调用它,并且此fragment 将与来自其他Activity 的结果一起回调。

public class EditableOffersListFragment extends Fragment implements OnClickButtonListener { ...

    @Override
    public void onClickButton(View v, int position, ArrayList<Offer> offers) {
            Offer from_item = offers.get(position);

            Intent intent = new Intent(getActivity(), OfferDetailsPopupActivity.class);
            intent.putExtra("new", false);
            intent.putExtra("offer_fromRecycler", from_item);
            startActivityForResult(intent, HTZ_ADD_OFFER); // <--- Note that this line has changed
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // Do your result handling here
    }
}

【讨论】:

  • 谢谢,我认为您可能是对的,但我仍然面临在适配器(最后一段代码)中出现错误“无法从静态上下文调用非静态方法”的问题...
  • 我在您提供的代码中看不到任何static 变量,因此我无法真正分辨出static 是什么,什么不是static。让我知道是否可以为您提供进一步的帮助
  • 据我了解,静态上下文是适配器。没有显式声明的静态变量,只是一个静态上下文..
【解决方案2】:

好的,终于解决了。

有效的方法是将 OnClickButtonListener 成员添加到 Adapter,该成员从 Adapter 构造函数中的 Fragment 传递(Fragment 正在实现 OnClickButtonListener,所以我只是将“this”传递给构造函数)。

这样,在适配器中执行的所有操作都在 OnClickButtonListener 的实例上,并且解决了静态/非静态问题。

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多