You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在非Activity的RecyclerView.Adapter中调用getSharedPreferences获取数据

问题根因

getSharedPreferences() 是 Android Context 类的实例方法,必须通过 Context 的实体对象调用。而你自定义的 MyAdapter 继承自 RecyclerView.Adapter,本身不属于 Context 子类,也没有默认持有 Context 实例,所以直接调用会触发静态上下文引用错误。

之前方案失败的原因
  • 直接通过Context类调用:getSharedPreferences()不是静态方法,不能通过类名直接调用
  • 使用this关键字调用:this指向当前Adapter实例,本身不具备getSharedPreferences()方法
  • 声明为static类型:既无法解决方法调用的来源问题,还会引发内存泄漏风险,静态变量生命周期和应用进程一致,会长期持有引用导致关联组件无法被回收
正确解决方案

推荐通过构造函数传入 Context 实例的方式实现,这是 RecyclerView Adapter 获取 Context 的标准用法:

  1. 首先在MyAdapter中添加Context成员变量,修改构造函数接收Context参数,建议使用ApplicationContext避免内存泄漏:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewholder> {
    private Context mContext;
    // 其他原有成员变量

    // 修改构造函数
    public MyAdapter(Context context, /* 你原有构造函数的其他参数,比如数据源列表 */) {
        // 取ApplicationContext避免持有Activity等短生命周期组件的引用导致内存泄漏
        this.mContext = context.getApplicationContext();
        // 原有构造函数的其他逻辑
    }

    // 其他原有Adapter逻辑
}
  1. 在需要读取SharedPreferences的位置,通过持有的mContext实例调用方法即可:
SharedPreferences mySharedPrefData = mContext.getSharedPreferences("mySharedPrefData", Context.MODE_PRIVATE);
// 后续读取存储内容的逻辑
  1. 初始化Adapter的位置(通常是Activity/Fragment)传入Context即可:
// Activity中初始化示例
MyAdapter adapter = new MyAdapter(MainActivity.this, /* 其他参数 */);
recyclerView.setAdapter(adapter);

内容的提问来源于stack exchange,提问作者Steven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:39:03