📌  相关文章
📜  如何在 recyclerview 适配器中获取上下文 (1)

📅  最后修改于: 2023-12-03 15:24:22.427000             🧑  作者: Mango

如何在 RecyclerView 适配器中获取上下文

在 Android 的 RecyclerView 中,适配器是用来将数据与视图进行关联的重要组件。在适配器中,我们不可避免地需要获取上下文(Context)对象,例如用于加载布局(Inflate)或者启动 Activity 等操作。

本篇文章将介绍在 RecyclerView 适配器中如何获取上下文对象,并提供常见的方法和代码片段,帮助程序员快速解决相关问题。

获取上下文对象的方法
方法一:通过构造函数传递

在 RecyclerView 适配器的构造函数中传递上下文对象,然后在适配器中使用该对象即可。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private Context mContext;
    private List<String> mData;

    public MyAdapter(Context context, List<String> data) {
        mContext = context;
        mData = data;
    }

    // ...
}

注意:不要使用 Activity 或者 Application 的上下文对象,因为这样容易造成内存泄漏。建议使用 Application 的上下文对象。

方法二:通过 itemView 获取

在 RecyclerView.ViewHolder 中,有一个 itemView 属性,它可以用来获取上下文对象。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private List<String> mData;

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView mTextView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mTextView = itemView.findViewById(R.id.text_view);
        }
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        String data = mData.get(position);
        holder.mTextView.setText(data);

        Context context = holder.itemView.getContext();
        // ...
    }

    // ...
}
方法三:通过 View.getContext() 获取

在 RecyclerView.ViewHolder 中,每个 View 都有一个 getContext() 方法,它可以用来获取上下文对象。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private List<String> mData;

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView mTextView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mTextView = itemView.findViewById(R.id.text_view);
        }
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        String data = mData.get(position);
        holder.mTextView.setText(data);

        Context context = holder.mTextView.getContext();
        // ...
    }

    // ...
}
总结

在 RecyclerView 适配器中获取上下文对象,有多种方法可选。根据实际情况来选择最合适的方法,以便在适配器中正常操作视图。

建议优先使用第二种方法,因为它不需要额外存储上下文对象,并且避免了内存泄漏的风险。如果第二种方法无法满足需要,可以考虑使用第一种或者第三种方法。