【问题标题】:passing `this` to a constructor from different fragments将 `this` 从不同的片段传递给构造函数
【发布时间】:2018-05-19 07:30:54
【问题描述】:

我有四个不同的片段类,它们都实例化了我的自定义 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”参数的构造函数中接受某种通用类型?或者也许让所有四个片段都扩展同一个类,这样我就可以在调用构造函数时转换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);
}

我想从单个类引用变量中进行调用。

【问题讨论】:

  • 是 FeaturedFragment、GeneralInfoFragment 等实现/扩展类有通用接口/类
  • 它们都扩展了 Fragment 并实现了 View.OnClickListener。而且它们都有public setButtonCallback(int position),这是ArrayAdapter使用片段引用调用的方法。
  • 我猜所有四个片段都可以实例化一个实现setButtonCallBack()的新类ManageButtons。片段可以在其构造函数中传递需要更新到ManageButtons 的TextView,然后将它们对ManageButtons 的引用传递给ArrayAdapter 构造函数,而不是每个唯一的片段引用?设置起来有点复杂,但还不错。
  • setButtonCallback(int position) 方法是否存在于 FragmentView.OnClickListener 上?如果是,是哪一个?
  • 两者都不存在,我目前在我的四个片段类中都复制了它的实现。

标签: java android-fragments constructor android-arrayadapter


【解决方案1】:

老兄,你做错了。你甚至没有在上一个问题中问我。您不需要在适配器中定义具体的回调类型,只需将其声明为 CallbackInterface callback 然后将具体实现传递给它:

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

如果你想用GeneralInfoFragment 回调创建一个InfoViewAdapter,你只需调用:

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

通过在CallbackInterface 中定义通用回调方法,您可以在不了解具体实现类(称为后期绑定或多态)的情况下调用它们:

callback.execute();

【讨论】:

  • 那么,CallbackInterface 是我定义的一个新类,它实现了execute() 的公共方法或接口?然后这四个片段可以实例化CallbackInterface 并将该引用传递给CustomAdapter 以供其访问execute
  • 正确。您不需要像这样使用 4 个构造函数创建 InfoViewAdapter,因为它仅在 callback 实例中有所不同。你只需像我上面写的那样将回调传递给那个。
  • 好的,我会玩这个,这听起来像是我在上面的问题评论中试图解释的。当涉及到很多概念时,我正在尝试实现这一点,而我们在我的 Android 课程中还没有真正触及。感谢您提供的重要信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多