передача `this` конструктору из разных фрагментов - PullRequest
0 голосов
/ 19 мая 2018

У меня есть четыре различных класса фрагментов, которые все создают экземпляр моего собственного ArrayAdapter.Все они должны включить ссылку на себя в конструктор ArrayAdapter.

Мои четыре класса фрагментов: "FeaturedFragment", "GeneralInfoFragment", "VisitingFragment" и "LivingHereFragment".

Для того, чтобыпринимать ссылки на каждый из этих различных классов, в настоящее время в моем классе ArrayAdapter есть четыре конструктора:

infoViewAdapter(Context context, ArrayList<MordorInfo> list, FeaturedFragment cb) {
    super (context, 0, list);
    myContext = context;
    infoList = list;
    featuredCallback = cb;
}

infoViewAdapter(Context context, ArrayList<MordorInfo> list, GeneralInfoFragment cb) {
    super (context, 0, list);
    myContext = context;
    infoList = list;
    generalInfoCallback = cb;
}

infoViewAdapter(Context context, ArrayList<MordorInfo> list, LivingHereFragment cb) {
    super (context, 0, list);
    myContext = context;
    infoList = list;
    livingHereCallback = cb;
}

infoViewAdapter(Context context, ArrayList<MordorInfo> list, VisitingFragment cb) {
    super (context, 0, list);
    myContext = context;
    infoList = list;
    visitingCallback = cb;
}

Есть ли способ объединить их в один конструктор?Возможно, приняв несколько общий тип в конструкторе для параметра «это»?Или, может быть, все четыре фрагмента расширяют один и тот же класс, чтобы я мог приводить this при вызове конструктора?

Получив ссылки, я использую их для выполнения открытого метода в соответствующем фрагменте:

if (featuredCallback != null) {
    featuredCallback.setButtonCallback(currentInfo.gotoRef);
} else if (generalInfoCallback != null) {
    generalInfoCallback.setButtonCallback(currentInfo.gotoRef);
} else if (visitingCallback != null) {
    visitingCallback.setButtonCallback(currentInfo.gotoRef);
} else if (livingHereCallback != null) {
    livingHereCallback.setButtonCallback(currentInfo.gotoRef);
}

Я бы хотел сделать этот вызов из единственной ссылочной переменной класса.

1 Ответ

0 голосов
/ 19 мая 2018

Чувак, ты делаешь это неправильно.Вы даже не спрашиваете меня в предыдущем вопросе.Вам не нужно определять конкретный тип обратного вызова в вашем адаптере, просто объявите его как CallbackInterface callback, затем передайте ему конкретную реализацию:

InfoViewAdapter(Context context, ArrayList<MordorInfo> list, CallbackInterface cb) {
    super (context, 0, list);
    myContext = context;
    infoList = list;
    callback = cb;
}

Если вы хотите создать InfoViewAdapter с GeneralInfoFragmentДля обратного вызова вы просто вызываете:

GeneralInfoFragment callback = new GeneralInfoFragment();
new InfoViewAdapter(context, list, callback);

Определив общий метод обратного вызова в вашем CallbackInterface, вы можете вызывать их без знания о конкретном классе реализации (который называется поздним связыванием или полиморфом):

callback.execute();
...