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

Android开发:如何从ListView所在Activity向源Activity返回对象?

解决方案:Activity间返回Parcelable对象

没问题,咱们一步步调整代码来实现你的需求——从Activity B把选中的完整Agente对象返回给Activity A:

步骤1:在Activity B中保存完整的Agente列表

你现在的代码只保存了用于展示的name+last_name字符串列表,点击列表项时无法获取对应的完整Agente对象。所以首先要在B类中添加一个成员变量来存储所有Agente实例:

public class B extends AppCompatActivity {
    ListView listViewPacientes;
    // 新增:保存完整的Agente列表
    private ArrayList<Agente> agenteList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        listViewPacientes = findViewById(R.id.listViewPacientes);
        // 初始化列表
        agenteList = new ArrayList<>();
        
        // ... 原有点击事件代码稍后修改
        buscar();
    }

然后在buscar()方法的循环里,把每个创建好的Agente对象加入到这个列表中(注意修正JSON数组遍历的长度判断,避免越界):

private void buscar(){
    String url = getString(R.string.url);
    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                ArrayList<String> tubeLines = new ArrayList<>();
                // 清空列表避免重复加载
                agenteList.clear();
                JSONArray contentArray = response.getJSONArray("content");
                // 遍历content数组,而不是response对象的长度
                for(int i=0;i<contentArray.length();i++) {
                    JSONObject line = contentArray.getJSONObject(i);
                    int id = Integer.parseInt(line.optString("id"));
                    String name = line.optString("name");
                    String last_name = line.optString("last_name");
                    Agente agente = new Agente(id, name, last_name);
                    String nameAndLastname = name +" "+ last_name;
                    tubeLines.add(nameAndLastname);
                    // 新增:把完整对象加入列表
                    agenteList.add(agente);
                }
                ListView myListView = findViewById(R.id.listViewPacientes);
                ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, tubeLines);
                myListView.setAdapter(arrayAdapter);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("errorJSON",error.toString());
        }
    });
    ConexionApi.getInstance(this).addToRequestQueue(jsObjRequest);
}

步骤2:修改ListView点击事件,返回选中的Agente对象

在点击事件中,通过position从agenteList中拿到对应的对象,然后把它放入Intent,设置结果并关闭Activity:

listViewPacientes.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // 获取选中的Agente对象
        Agente selectedAgente = agenteList.get(position);
        Intent resultadoIntent = new Intent();
        // 把Parcelable对象放入Intent,自定义一个key用于后续取出
        resultadoIntent.putExtra("SELECTED_AGENTE", selectedAgente);
        // 设置结果为RESULT_OK,表示成功返回数据
        setResult(Activity.RESULT_OK, resultadoIntent);
        // 关闭Activity B,回到A
        finish();
    }
});

步骤3:在Activity A中接收返回的Agente对象

修改onActivityResult方法,取出Intent中的Parcelable对象并处理:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // 先调用super方法,避免AndroidX兼容性问题
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == AN_INTEGER) {
        if(resultCode == Activity.RESULT_OK){
            // 取出返回的Agente对象
            Agente selectedAgente = data.getParcelableExtra("SELECTED_AGENTE");
            if(selectedAgente != null){
                // 这里处理拿到的对象,比如打印信息或更新UI
                Log.d("AgenteInfo", "ID: " + selectedAgente.getId() + ", Name: " + selectedAgente.getName() + " " + selectedAgente.getLastName());
                // 你的后续业务逻辑写在这里
            }
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            // 用户取消操作时的处理逻辑
            Log.d("Result", "用户未选择任何项");
        }
    }
}

关键说明

  • 你的Agente类已经正确实现了Parcelable接口,这是Android中传递自定义对象的高效方式,无需额外修改。
  • 必须在B中调用setResult()和finish(),否则A的onActivityResult不会收到正确的结果回调。
  • 遍历JSON数组时一定要用contentArray.length(),而不是response.length(),前者才是数组的真实长度,避免出现数组越界异常。

内容的提问来源于stack exchange,提问作者Bruno Fernandez Ellerbach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:21:42