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

Android:如何将SharedPreferences值显示到CardView?适配器集成方法

嘿,这事儿其实挺简单的,我给你一步步拆解怎么在Adapter里集成SharedPreferences,把用户详情显示到CardView里:

步骤1:给Adapter传入Context并初始化SharedPreferences

因为SharedPreferences需要依赖Context才能获取实例,所以你得在Adapter的构造方法里接收Context参数,然后用它初始化SharedPreferences。这样在整个Adapter里都能调用SharedPreferences读取数据了。

示例代码如下:

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.MyViewHolder> {
    // 保存Context和SharedPreferences实例
    private Context mContext;
    private SharedPreferences mSharedPrefs;

    // 构造方法:传入Context
    public UserAdapter(Context context) {
        this.mContext = context;
        // 初始化SharedPreferences,这里的"user_details"是你存储用户信息时用的SP名称,要和存的时候一致!
        mSharedPrefs = mContext.getSharedPreferences("user_details", Context.MODE_PRIVATE);
    }

    // 你的ViewHolder类,这里假设CardView里有用户名、邮箱两个文本控件
    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView tvUserName;
        TextView tvUserEmail;

        public MyViewHolder(View itemView) {
            super(itemView);
            // 绑定CardView里的控件ID
            tvUserName = itemView.findViewById(R.id.tv_user_name);
            tvUserEmail = itemView.findViewById(R.id.tv_user_email);
        }
    }

    // onCreateViewHolder方法(你应该已经写了,这里贴出来是为了完整)
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // 加载CardView的布局文件
        View cardView = LayoutInflater.from(mContext).inflate(R.layout.item_user_card, parent, false);
        return new MyViewHolder(cardView);
    }
步骤2:在onBindViewHolder中读取数据并绑定到CardView

接下来就是你已经在用的onBindViewHolder方法了,在这里从SharedPreferences里取出用户数据,然后设置到CardView的对应控件上就行。

如果是单个用户的信息(大部分场景都是这样),直接读取对应key的值即可:

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    // 从SharedPreferences读取数据,第二个参数是默认值(如果没取到数据就显示这个)
    String userName = mSharedPrefs.getString("key_user_name", "未知用户名");
    String userEmail = mSharedPrefs.getString("key_user_email", "未知邮箱");
    // 如果是其他类型的数据,比如年龄用getInt,性别用getBoolean,以此类推
    // int userAge = mSharedPrefs.getInt("key_user_age", 0);

    // 把数据绑定到CardView的控件上
    holder.tvUserName.setText(userName);
    holder.tvUserEmail.setText(userEmail);
}

如果你的列表是展示多个用户的信息(比如把多个用户存在SharedPreferences里),那可以把用户列表存成JSON字符串,读取后解析成集合,再根据position取对应位置的用户数据:

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    // 读取存储的用户列表JSON字符串
    String usersJson = mSharedPrefs.getString("key_users_list", "[]");
    // 用Gson解析成List<User>(需要先引入Gson依赖)
    List<User> userList = new Gson().fromJson(usersJson, new TypeToken<List<User>>(){}.getType());
    
    // 根据position获取当前用户
    User currentUser = userList.get(position);
    // 绑定数据
    holder.tvUserName.setText(currentUser.getName());
    holder.tvUserEmail.setText(currentUser.getEmail());
}
一些需要注意的细节
  • 确保SharedPreferences的存储名称和key值和你存入数据时完全一致,不然会取不到数据!
  • 为了避免内存泄漏,尽量用mContext.getApplicationContext()来初始化SharedPreferences,而不是直接用Activity的Context:
    mSharedPrefs = mContext.getApplicationContext().getSharedPreferences("user_details", Context.MODE_PRIVATE);
    
  • 如果用户信息可能更新(比如修改了用户名),更新完SharedPreferences后记得调用Adapter的notifyDataSetChanged()方法,让CardView刷新显示最新数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:56:56