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
相关产品推荐
相关产品推荐

