Имитация «onActivityResult» внутри адаптера RecyclerView - PullRequest
0 голосов
/ 04 мая 2019

У меня есть RecyclerView, элементы которого содержат кнопку, которая запускает действие с помощью startActivityForResult.Метод onClick был реализован внутри адаптера, и onActivityResult из фрагмента, содержащего RecyclerView, не был вызван по возвращении из нового действия.Как я узнал, этого следовало ожидать, поскольку startActivityForResult не был вызван из этого фрагмента.

Наиболее близким решением, которое я нашел, было следующее: onActivityResult внутри RecyclerView.Adapter не используется

Но при попытке использовать интерфейс для реализации метода 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 голосов
/ 04 мая 2019

Хорошо, наконец-то решена.

Что работало, так это добавление элемента OnClickButtonListener к адаптеру, который передается из фрагмента в конструкторе адаптера (фрагмент выполняет OnClickButtonListener, поэтому я просто передал this вконструктор).

Таким образом, все действия, выполняемые в адаптере, выполняются на экземпляре OnClickButtonListener, и статическая / нестатическая проблема была решена.

0 голосов
/ 04 мая 2019

Я думаю, что проблема, с которой вы сейчас сталкиваетесь, заключается в том, что вы звоните startActivityForResult из Activity, содержащего текущий фрагмент, а не сам фрагмент. Таким образом, использование 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...