如何在非Activity的RecyclerView.Adapter中调用getSharedPreferences获取数据
问题根因
getSharedPreferences() 是 Android Context 类的实例方法,必须通过 Context 的实体对象调用。而你自定义的 MyAdapter 继承自 RecyclerView.Adapter,本身不属于 Context 子类,也没有默认持有 Context 实例,所以直接调用会触发静态上下文引用错误。
之前方案失败的原因
- 直接通过
Context类调用:getSharedPreferences()不是静态方法,不能通过类名直接调用 - 使用
this关键字调用:this指向当前Adapter实例,本身不具备getSharedPreferences()方法 - 声明为static类型:既无法解决方法调用的来源问题,还会引发内存泄漏风险,静态变量生命周期和应用进程一致,会长期持有引用导致关联组件无法被回收
正确解决方案
推荐通过构造函数传入 Context 实例的方式实现,这是 RecyclerView Adapter 获取 Context 的标准用法:
- 首先在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逻辑 }
- 在需要读取SharedPreferences的位置,通过持有的mContext实例调用方法即可:
SharedPreferences mySharedPrefData = mContext.getSharedPreferences("mySharedPrefData", Context.MODE_PRIVATE); // 后续读取存储内容的逻辑
- 初始化Adapter的位置(通常是Activity/Fragment)传入Context即可:
// Activity中初始化示例 MyAdapter adapter = new MyAdapter(MainActivity.this, /* 其他参数 */); recyclerView.setAdapter(adapter);
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

