模仿RecyclerView适配器中的“ onActivityResult”

时间:2019-05-04 08:52:44

标签: java android android-recyclerview

我有一个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);
                }
            });

2 个答案:

答案 0 :(得分:0)

我认为您当前面临的问题是您正在从包含当前片段而不是片段本身的startActivityForResult调用Activity。因此,使用this或简单地调用startActivityForResult将从片段而不是Activity调用它,并且此fragment将被其他{{1 }}。

Activity

答案 1 :(得分:0)

好,终于解决了。

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

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