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

Android求职APP:SharedPreferences多Job ID存储与读写方案求助

解决SharedPreferences存储多职位数据的问题

你当前遇到的核心问题是每次解析职位数据时都会覆盖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:45:20