簡體   English   中英

在RecyclerView的Adapter中模仿'onActivityResult'

[英]Imitate 'onActivityResult' inside an Adapter of RecyclerView

我有一個RecyclerView,其中的項目包含一個使用startActivityForResult啟動活動的按鈕。 onClick方法在適配器內部實現,並且從新活動返回時未調用包含RecyclerView的片段的onActivityResult。 據我所知,這是可以預料到的,因為沒有從這個片段中調用startActivityForResult。

我發現的最接近解決方案的是: 不使用RecyclerView.Adapter中的onActivityResult

但是當我嘗試使用接口來實現onClick方法時,我現在面臨一個新問題:我無法調用適配器內的onClick方法,雖然它是在activity中實現的,因為Adapter的上下文是靜態的,方法是非靜態的。

下面是一些代碼部分,以更好地解釋當前的情況。 我迫切需要一種替代解決方案,我真的一直在尋找。 謝謝。

該片段實現了接口:

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);
                }
            });

我認為你目前面臨的問題是你從包含當前片段的Activity而不是Fragment本身調用startActivityForResult 所以使用this或者只是簡單地調用startActivityForResult將從Fragment而不是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
    }
}

好的,終於解決了。

有用的是將一個OnClickButtonListener成員添加到Adapter,它從Adapter的構造函數中的Fragment傳遞(Fragment正在實現OnClickButtonListener,所以我只是將'this'傳遞給構造函數)。

這樣,適配器中執行的所有操作都在OnClickButtonListener的實例上,並且解決了靜態/非靜態問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM