【问题标题】:Java Generic from Activity to fragment to adapterJava Generic 从 Activity 到 Fragment 到 Adapter
【发布时间】:2020-06-29 08:08:44
【问题描述】:

我在 android 应用程序中工作,设计了一个通用适配器,参数化适配器将继承它。

public abstract class CarAdapter<T> extends RecyclerView.Adapter<CarAdapter<T>.BaseCarViewHolder> {
    protected DialogMakerCar<T> dialogMaker;
    protected Context context;
......

子类

public class CarItemAdapter extends CarDialogAdapter<Item> {

    public CarItemAdapter(Context context, DialogMakerCar<Item> dialogMaker) {
        super(dialogMaker, context);
    }

我在片段中调用此适配器,并且该片段也需要是通用的,以便我可以为来自活动的自定义对象调用此片段和适配器。

//Fragment to call adapter but its not letting me to use <T> generic 
 adapter = new CarItemAdapter(getContext(),dialogMaker);
        gridRecycler.setHasFixedSize(true);
        gridRecycler.setLayoutManager(adapter.getLayoutManager());

如果您需要更多详细信息,请告诉我,谢谢

【问题讨论】:

  • 当您在 CarItemAdapter 中定义 T 是 Item 时,您实际上是在使用 T。您可以更改 CarDialogAdapter 的 CardItemAdapter 并在此时定义 T,如果那是您正在寻找的。​​span>
  • @MissingSemiColon 请让我知道你到底在说什么,基本上,我希望适配器具有我将在活动中初始化的通用对象列表,但我不会从活动而不是从片段,该片段类是从 Activity 调用的,因此我可以使用 Activity 类中的确切类型进行初始化,但片段不知道它不让我对适配器调用使用泛型。活动 --> 片段 --> 适配器
  • 问题是 CarItemAdapter 不是通用的,您正在定义它使用 Item。您可以在 CarItemAdapter 中定义一个泛型,或者如果您想要完成的是片段根据 Activity 的需要创建一个适配器,则您必须定义一个接口。我不完全理解你真正想要什么,但我猜你正在尝试创建某种工厂,片段应该返回正确的适配器,而活动不应该关心真正的适配器是什么。这是通过使用接口来完成的。阅读 List 接口,它是一个接口并使用泛型。
  • 是的@MissingSemiColon 你正确理解我想要什么,我只是想了解更多关于你建议的方法。

标签: java android android-fragments generics


【解决方案1】:

我不是 Android 开发者,所以不能给你一个真实的例子。 让我们定义如下接口(我不知道你需要的真正方法,所以只是做了一个简单的例子)

public interface ICarAdapter {

    public <T> DialogMakerCar<T> getDialogMaker();

    public Context getContext();

}

您可以定义 T 扩展的内容以避免在其他类中使用时出现警告。

现在你需要在你定义的类中使用这个接口:

public class CarItemAdapter extends DialogMakerCar<Item> implements ICarAdapter{
  private DialogMakerCar<Item> dialogMakerCar;
  private Context context;

  public CarItemAdapter(Context cntxt, DialogMakerCar<Item> dialogMaker) {
    dialogMakerCar = dialogMaker;
    context = cntxt;
  }

  /** This will give you a warning, can be avoided 
      if you define in the interface that T extendes 
      an interface that Item implements.*/
  @Override
  public DialogMakerCar<Item> getDialogMaker() {
    return dialogMakerCar;
  }

  @Override
  public Context getContext() {
    return context;
  }
}

在片段类中:

public class Fragment {
   
  public <T> ICarAdapter createAdapter(T item) {
    //You can manage this as you want, 
    //with a switch, defining an Enum or passing the Class that you want. 
    if (item instanceof Item) {
        return new CarItemAdapter(getContext(),dialogMaker);
    }
    return null;
}

然后当你想使用它时:

public class Activity {

    Fragment fragment;

    ICarAdapter adapter;

    public Activity() {
        fragment = new Fragment();
        Item item = new Item();
        adapter = fragment.createAdapter(item);
        adapter.getContext();
        adapter.getDialogMaker();
    }

希望至少对你有所帮助。

其他方法:

https://dzone.com/articles/java-generic-factory

https://stackoverflow.com/a/47464801/6708879

Generic factory with unknown implementation classes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多