Android求职APP:SharedPreferences多Job ID存储与读写方案求助
你当前遇到的核心问题是每次解析职位数据时都会覆盖SharedPreferences里的单个jobId,导致只能保留最后一个职位的ID。要实现多职位申请的存储,我们需要把选中的职位列表转换成JSON字符串存入SharedPreferences,读取时再解析回列表。下面是具体的解决方案:
核心思路
SharedPreferences本身只支持存储基础数据类型,但我们可以通过将对象列表序列化为JSON字符串来间接存储复杂数据。推荐使用Google的Gson库来简化序列化/反序列化操作,当然也可以用原生JSON API手动处理。
步骤1:移除错误的存储逻辑
首先,你在ParserCard的parse方法里循环存储单个jobId是错误的——这会让每次解析都覆盖之前的ID。删掉这段代码:
// 从ParserCard的parse方法中移除以下代码 job=jsonObject.getString("job_id"); SharedPreferences.Editor editor = c.getSharedPreferences(Config.SHARED_PREF_NAME, MODE_PRIVATE).edit(); editor.putString("jobId", job); editor.commit();
步骤2:添加Gson依赖(推荐)
在app/build.gradle的dependencies块中添加Gson依赖,简化JSON转换:
implementation 'com.google.code.gson:gson:2.10.1' // 可使用最新版本
步骤3:创建SharedPreferences工具类
写一个工具类封装职位列表的存储、读取和添加操作,避免重复代码:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; import android.content.Context; import android.content.SharedPreferences; public class SharedPrefsJobHelper { private static final String APPLIED_JOBS_KEY = "applied_jobs_list"; private final SharedPreferences prefs; private final Gson gson; public SharedPrefsJobHelper(Context context) { prefs = context.getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE); gson = new Gson(); } // 保存已申请的职位列表 public void saveAppliedJobs(ArrayList<getData> appliedJobs) { String jsonString = gson.toJson(appliedJobs); prefs.edit().putString(APPLIED_JOBS_KEY, jsonString).apply(); } // 获取已申请的职位列表 public ArrayList<getData> getAppliedJobs() { String jsonString = prefs.getString(APPLIED_JOBS_KEY, null); if (jsonString == null) { return new ArrayList<>(); } Type listType = new TypeToken<ArrayList<getData>>() {}.getType(); return gson.fromJson(jsonString, listType); } // 添加单个职位到申请列表(自动去重) public void addAppliedJob(getData newJob) { ArrayList<getData> appliedJobs = getAppliedJobs(); // 检查是否已申请过该职位,避免重复提交 boolean isAlreadyApplied = false; for (getData job : appliedJobs) { if (job.getJob_id().equals(newJob.getJob_id())) { isAlreadyApplied = true; break; } } if (!isAlreadyApplied) { appliedJobs.add(newJob); saveAppliedJobs(appliedJobs); } } }
步骤4:在Adapter中添加申请按钮逻辑
假设你的cardview布局里有一个申请按钮(比如id为btn_apply),在SwipeDeckAdapter的getView方法中添加点击事件,触发职位存储:
@Override public View getView(final int position, View convertView, ViewGroup parent) { mInflater = LayoutInflater.from(context); View v = convertView; if (v == null) { v = mInflater.inflate(R.layout.cardview, null); } // 原有控件绑定逻辑保持不变 getData pd = data.get(position); TextView tv_title = v.findViewById(R.id.cardviewjobheading); TextView tv_description = v.findViewById(R.id.cardviewJobDescription); // ... 其他控件绑定代码 // 添加申请按钮点击事件 Button btnApply = v.findViewById(R.id.btn_apply); btnApply.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getData currentJob = data.get(position); SharedPrefsJobHelper helper = new SharedPrefsJobHelper(context); helper.addAppliedJob(currentJob); Toast.makeText(context, "已申请该职位", Toast.LENGTH_SHORT).show(); } }); return v; }
步骤5:读取并提交已申请的职位
当需要把已申请的职位发送到服务器时,读取存储的列表并逐个提交:
// 示例:在提交申请的方法中调用 private void submitAppliedJobs() { SharedPrefsJobHelper helper = new SharedPrefsJobHelper(this); ArrayList<getData> appliedJobs = helper.getAppliedJobs(); String userId = "当前用户ID"; // 替换成你的用户ID获取逻辑 for (getData job : appliedJobs) { String jobId = job.getJob_id(); // 调用你的PHP接口发送userId和jobId // 这里可以用AsyncTask、Retrofit等实现网络请求 sendApplyRequest(userId, jobId); } } // 示例网络请求方法(需自行实现) private void sendApplyRequest(String userId, String jobId) { // 你的网络请求逻辑,比如用AsyncTask发送POST请求到PHP接口 }
备选方案:原生JSON手动处理(无需Gson)
如果不想依赖Gson,可以用原生JSON API手动构建和解析:
// 手动添加职位 public void addJobManually(Context context, getData job) { SharedPreferences prefs = context.getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE); String existingJson = prefs.getString(APPLIED_JOBS_KEY, "[]"); try { JSONArray jsonArray = new JSONArray(existingJson); JSONObject jobObj = new JSONObject(); jobObj.put("job_id", job.getJob_id()); jobObj.put("job_title", job.getJob_title()); // 按需添加其他字段 jsonArray.put(jobObj); prefs.edit().putString(APPLIED_JOBS_KEY, jsonArray.toString()).apply(); } catch (JSONException e) { e.printStackTrace(); } } // 手动解析职位列表 public ArrayList<getData> getJobsManually(Context context) { SharedPreferences prefs = context.getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE); String json = prefs.getString(APPLIED_JOBS_KEY, "[]"); ArrayList<getData> jobs = new ArrayList<>(); try { JSONArray jsonArray = new JSONArray(json); for (int i = 0; i < jsonArray.length(); i++) { JSONObject obj = jsonArray.getJSONObject(i); getData job = new getData(); job.setJob_id(obj.getString("job_id")); job.setJob_title(obj.getString("job_title")); jobs.add(job); } } catch (JSONException e) { e.printStackTrace(); } return jobs; }
内容的提问来源于stack exchange,提问作者Irshad Madappat
相关产品推荐
相关产品推荐

