如何将SharedPreferences存储的带ID用户信息展示到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
相关产品推荐
相关产品推荐

