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

如何将SharedPreferences存储的带ID用户信息展示到RecyclerView?

解决方案:将SharedPreferences中的用户数据展示到RecyclerView

核心思路

先把SharedPreferences中带ID的零散用户数据整理成实体类列表,再通过RecyclerView的标准Adapter绑定数据展示。以下是分步实现:


1. 创建用户实体类

定义一个User类,封装ID、姓名、年龄、出生日期这些字段:

// Kotlin示例,Java写法逻辑一致
data class User(
    val id: String,
    val name: String,
    val age: Int,
    val birthDate: String
)

2. 从SharedPreferences读取并整理数据

根据你存储数据的格式,选择对应的读取方式:

情况1:数据按user_{id}_字段名拆分存储(如user_1_name、user_1_age)

fun getUsersFromSharedPrefs(context: Context): List<User> {
    val prefs = context.getSharedPreferences("UserPrefs", Context.MODE_PRIVATE)
    val users = mutableListOf<User>()
    val allEntries = prefs.all

    // 先提取所有用户ID
    val userIds = mutableSetOf<String>()
    for (key in allEntries.keys) {
        if (key.startsWith("user_") && key.endsWith("_name")) {
            // 从"user_xxx_name"中截取ID部分
            val id = key.substring(5, key.length - 5)
            userIds.add(id)
        }
    }

    // 根据ID读取完整用户信息
    for (id in userIds) {
        val name = prefs.getString("user_${id}_name", "") ?: ""
        val age = prefs.getInt("user_${id}_age", 0)
        val birthDate = prefs.getString("user_${id}_birthDate", "") ?: ""
        users.add(User(id, name, age, birthDate))
    }
    return users
}

情况2:每个用户信息以JSON字符串存储,ID作为键(如user_1对应完整用户JSON)

// 需要引入Gson库处理JSON解析,或用Android原生JSON API
fun getUsersFromSharedPrefs(context: Context): List<User> {
    val prefs = context.getSharedPreferences("UserPrefs", Context.MODE_PRIVATE)
    val users = mutableListOf<User>()
    val allEntries = prefs.all
    val gson = Gson()

    for ((key, value) in allEntries) {
        if (key.startsWith("user_")) {
            val user = gson.fromJson(value as String, User::class.java)
            users.add(user)
        }
    }
    return users
}

3. 实现RecyclerView的Adapter和ViewHolder

创建Adapter绑定User列表到列表项布局:

class UserAdapter(private val userList: List<User>) : RecyclerView.Adapter<UserAdapter.UserViewHolder>() {

    inner class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val tvId: TextView = itemView.findViewById(R.id.tv_id)
        val tvName: TextView = itemView.findViewById(R.id.tv_name)
        val tvAge: TextView = itemView.findViewById(R.id.tv_age)
        val tvBirthDate: TextView = itemView.findViewById(R.id.tv_birth_date)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_user, parent, false)
        return UserViewHolder(view)
    }

    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        val user = userList[position]
        holder.tvId.text = "ID: ${user.id}"
        holder.tvName.text = "姓名: ${user.name}"
        holder.tvAge.text = "年龄: ${user.age}"
        holder.tvBirthDate.text = "出生日期: ${user.birthDate}"
    }

    override fun getItemCount(): Int = userList.size
}

4. 编写列表项布局(item_user.xml)

创建每个列表项的UI布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp"
    android:background="@drawable/item_rounded_bg">

    <TextView
        android:id="@+id/tv_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textColor="@color/gray"/>

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_marginTop="4dp"/>

    <TextView
        android:id="@+id/tv_age"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:layout_marginTop="2dp"/>

    <TextView
        android:id="@+id/tv_birth_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:layout_marginTop="2dp"/>

</LinearLayout>

5. 在页面中初始化RecyclerView

在Activity或Fragment中加载数据并设置RecyclerView:

class UserListActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_user_list)

        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(this)
        // 读取用户数据
        val userList = getUsersFromSharedPrefs(this)
        // 设置Adapter
        val adapter = UserAdapter(userList)
        recyclerView.adapter = adapter
    }
}

注意事项

  • 如果用户数据有更新(新增/修改/删除),需要重新读取数据并调用adapter.notifyDataSetChanged()刷新列表
  • 确保SharedPreferences的存储格式和读取逻辑一致,避免解析错误
  • 若使用Java开发,只需将Kotlin代码转换成对应的Java语法即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:23:22