Вызов метода Fragment из присоединенного RecyclerView.Adapter - PullRequest
0 голосов
/ 09 октября 2018

Я недавно начал кодировать свой первый проект Android с использованием Android Studio 3.1.2 и SDK 19.

Один из моих фрагментов содержит RecyclerView с пользовательским приложением RecyclerView.Adapter.На CardView адаптер получает его ViewHolder, там может быть кнопка.Цель, если кнопка нажата, должен вызываться метод моего фрагмента, хотя это экземпляр пользовательского подкласса Fragment:

From RequestingFragment :

public abstract class RequestingFragment extends Fragment implements RequestCallbacks {

    public final static void startRequest(final RequestOperation, String param) {
        //this is the guy i want to call
    }

    //these are the RequestCallbacks, they're all getting called in startRequest()
    public void onSuccess(JSONObject json, String parsingkey) { }

    public void onError() { }

    public void onFinished() { }

Теперь один из моих RequestingFragment s содержит RecyclerView, к которому прикреплен пользовательский ErrorCompactAdapter .Внутри адаптеров ViewHolder, где я загружаю макет для отдельных CardView, есть кнопка, которая должна вызывать startRequest() onClick из моего RequestingFragment

От ErrorCompactAdapter :

public class ErrorCompactAdapter extends RecyclerView.Adapter<ErrorCompactAdapter.ErrorCompactViewHolder> {

    private Context context;
    private ArrayList<Error> errors;

    public ErrorCompactAdapter(Context context, ArrayList<Error> errors) {
        this.context = context;
        this.errors = errors;
    }

    public void onBindViewHolder(ErrorCompactViewHolder, int position) {
        //...
        holder.errorTakeOverButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //here's were i'm stuck
            }
        });
        //...
    }
}

Мой первый подход заключался в изменении атрибута context ErrorCompactAdapter на RequestingFragment , чтобы я мог вызвать startRequest() для этого.

private Context context; // private RequestingFragment attacher;

public void onClick(View v) {
    attacher.startRequest(/*params*/);
}

Но я очень не уверен, будет ли фрагмент, который содержит RecyclerView, получить ответ на запрос или какой-то «псевдоанонимный» фрагмент получит ответ ипросто ничего с этим не делает.Может кто-то просветить меня, если это правильный путь?Спасибо вперед.

Ответы [ 2 ]

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

Два способа вызова функции фрагментов из адаптера.Во-первых, оригинальный / стандартный способ заключается в реализации интерфейса.

  1. Создайте интерфейс и методы (хотите вызывать фрагмент) в классе адаптера
  2. , которые реализуют в классе фрагмента и обратные вызовыбыть реализованным в этом
  3. При вызове адаптера отправьте экземпляр слушателя адаптеру и вызовите метод интерфейса через этот экземпляр

Код i kotlin (в классе адаптера)

interface ApiEventListener{
            fun setData(userToFollowModel: UserToFollowModel?)  {

        }
}

и в классе фрагментов

 ProfileApiCalls.ApiEventListener listener;
 profileApiCalls.getUserToFollow(getContext(),listener)

Второй способ отправки экземпляра фрагмента в адаптер и вызова метода фрагмента через этот экземпляр.как

 fragment.callMethodname()
0 голосов
/ 09 октября 2018

Передайте фрагмент в конструктор класса ErrorCompactAdapter.Это работает для меня так, как я хочу.У меня была такая же проблема.

RequestingFragment mFragment;

public ErrorCompactAdapter(Context context, ArrayList<Error> errors, 
                           RequestingFragment fragment) 
{
    this.context = context;
    this.errors = errors;
    this.mFragment = fragment;
}

// While passing the fragment into your adapter, do it this way.

ErrorCompactAdapter errorCompactAdapter = new ErrorCompactAdapter(
          context, errors, RequestingFragment.this);

holder.errorTakeOverButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // use you method of fragment here
        mFragment.startRequest();
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...