gpt4 book ai didi

android - 这两个上下文代码有什么不同?

转载 作者:行者123 更新时间:2023-12-05 00:18:59 25 4
gpt4 key购买 nike

我在 fragment 中使用recyclderview。
代码 1 和代码 2 有什么不同?
当我第一次将代码 2 与代码 3 一起使用时,它发生了错误。

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext()); // code 1

// LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); // code 2

context = parent.getContext(); //code 3
View itemView = inflater.inflate(R.layout.gallery_item, parent, false);

return new ViewHolder(itemView);
}
错误
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
at com.example.bstcproject.adapter.GalleryAdapter.onCreateViewHolder(GalleryAdapter.java:43)
at com.example.bstcproject.adapter.GalleryAdapter.onCreateViewHolder(GalleryAdapter.java:23)
我留下了代码 3,我使用了代码 1 而不是代码 2。它运行良好。
我认为这与上下文有关。但我不知道代码 1 和代码 2 有什么不同。
代码 1 和代码 2 都没有上下文吗?
有什么不同吗?

最佳答案

在 Android 中,LayoutInflater用于将 xml 文件( activity_main.xmlfragment_login.xmlgallery_item.xml 等)转换为其对应的 View目的。

XML file -> LayoutInflater -> View object in Java


检索 LayoutInflater 的实例,我们有几种选择:
  • LayoutInflater.from(Context)
  • Context.getSystemService(String)
  • Activity.getLayoutInflater()

  • 回到你的问题
    代码 1
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    parent : 当前项的父项,在本例中为 parentRecyclerView RecyclerViewView 的子类类(class),每个 View将有自己的上下文,在这种情况下, getContext()返回显示 RecyclerView 的 Activity .
    代码 2
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    在Android中,当初始化一个Adapter的实例时,我们通常会通过构造函数传递一个Context实例,像这样。
    class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;
    private List<Data> data;

    public MyAdapter(Context context, List<Data> data) {
    this.context = context;
    this.data = data;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = inflater.inflate(R.layout.gallery_item, parent, false);
    return new ViewHolder(itemView);
    }
    }
    在您的情况下,因为您没有为 context 分配任何值,这就是编译器抛出该错误的原因。
    代码 3
    context = parent.getContext();
    在这种情况下,您不需要传递 Context通过构造函数,只需使用 parent 中的上下文.
    class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<Data> data;

    public MyAdapter(List<Data> data) {
    this.data = data;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = inflater.inflate(R.layout.gallery_item, parent, false);
    return new ViewHolder(itemView);
    }
    }
    内部 onBindViewHolder() ,您有 3 个选项来检索 LayoutInflater 的实例:
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    Context context = parent.getContext();

    // Option 1
    LayoutInflater inflater = LayoutInflater.from(context);

    // Option 2
    LayoutInflater inflater2 = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    // Option 3
    LayoutInflater inflater3 = ((Activity) context).getLayoutInflater();

    View itemView = inflater.inflate(R.layout.gallery_item, parent, false);
    return new ViewHolder(itemView);
    }
    我总是选择选项 1,因为它很短。

    关于android - 这两个上下文代码有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65170854/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com