
本教程详细介绍了如何在android应用中,利用gson库高效地在不同activity之间传递包含自定义对象的arraylist。通过将对象列表序列化为json字符串进行传输,并反序列化恢复,解决了intent直接传递复杂对象集合的限制,提供了简洁实用的解决方案。
在Android开发中,Activity之间的数据传递是常见的需求。对于基本数据类型(如int、String)或可序列化(Serializable)/可打包(Parcelable)的对象,Intent提供了便捷的putExtra()方法。然而,当需要传递包含自定义对象的ArrayList时,如果自定义对象没有实现Serializable或Parcelable接口,直接使用Intent.putExtra(String name, ArrayList<? extends Parcelable> value)或Intent.putExtra(String name, Serializable value)会遇到困难,因为这要求列表中的每个对象都符合相应的接口。
尽管实现Serializable或Parcelable可以解决问题,但对于复杂的自定义对象,手动实现这些接口可能相对繁琐,尤其是在对象结构经常变化的情况下。为了简化这一过程,我们可以借助强大的JSON序列化库来高效地在Activity间传递复杂数据结构。
Gson 是Google提供的一个Java库,用于将Java对象序列化为JSON字符串,以及将JSON字符串反序列化为Java对象。它具有以下显著优势:
通过将自定义对象列表转换为JSON字符串,然后将该字符串通过Intent传递,接收方再将JSON字符串反序列化回原始对象列表,可以有效绕过Intent对复杂对象类型直接传递的限制。
在使用Gson之前,需要在项目的build.gradle(Module: app)文件中添加其依赖:
dependencies {
implementation 'com.google.code.gson:gson:2.10.1' // 使用最新版本
}添加依赖后,同步项目以使更改生效。
假设我们有一个名为ListeJoueurs的自定义类,用于表示球员信息。这个类是一个标准的POJO,无需实现任何特定的序列化接口:
public class ListeJoueurs {
String Nom;
String Prenom;
Long Licence;
String Cat;
String Select;
String dteN;
int imageClick;
// 构造函数
public ListeJoueurs(String Nom, String Prenom, Long Licence, String Cat, String Select, String dteN, int imageClick) {
this.Nom = Nom;
this.Prenom = Prenom;
this.Licence = Licence;
this.Cat = Cat;
this.Select = Select;
this.dteN = dteN;
this.imageClick = imageClick;
}
// Getter方法 (可选,但通常推荐添加)
public String getNom() { return Nom; }
public String getPrenom() { return Prenom; }
public Long getLicence() { return Licence; }
public String getCat() { return Cat; }
public String getSelect() { return Select; }
public String getDteN() { return dteN; }
public int getImageClick() { return imageClick; }
// toString方法,方便调试
@Override
public String toString() {
return "ListeJoueurs{" +
"Nom='" + Nom + '\'' +
", Prenom='" + Prenom + '\'' +
", Licence=" + Licence +
", Cat='" + Cat + '\'' +
", Select='" + Select + '\'' +
", dteN='" + dteN + '\'' +
", imageClick=" + imageClick +
'}';
}
}在发送数据的Activity中,我们需要创建一个ArrayList<ListeJoueurs>实例,然后使用Gson将其转换为JSON字符串,并通过Intent传递。
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.google.gson.Gson;
import java.util.ArrayList;
public class SendingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sending);
Button sendButton = findViewById(R.id.send_data_button);
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1. 创建 ArrayList<ListeJoueurs> 实例
ArrayList<ListeJoueurs> la = new ArrayList<>();
la.add(new ListeJoueurs("Messi", "Lionel", 10001L, "Forward", "Yes", "1987-06-24", R.drawable.ic_launcher_foreground));
la.add(new ListeJoueurs("Ronaldo", "Cristiano", 70007L, "Forward", "Yes", "1985-02-05", R.drawable.ic_launcher_background));
// 可以添加更多对象...
// 2. 使用 Gson 将 ArrayList 转换为 JSON 字符串
Gson gson = new Gson();
String jsonList = gson.toJson(la);
// 3. 通过 Intent 传递 JSON 字符串
Intent intent = new Intent(SendingActivity.this, ReceivingActivity.class);
intent.putExtra("player_list_json", jsonList); // 使用一个唯一的键
startActivity(intent);
}
});
}
}在上述代码中:
在接收数据的Activity中,我们需要从Intent中获取JSON字符串,然后使用Gson将其反序列化回原始的ArrayList<ListeJoueurs>。由于ArrayList是一个泛型类型,反序列化时需要借助TypeToken来正确指定目标类型。
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
public class ReceivingActivity extends AppCompatActivity {
private TextView receivedDataTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_receiving);
receivedDataTextView = findViewById(R.id.received_data_text_view);
// 1. 从 Intent 获取 JSON 字符串
String jsonList = getIntent().getStringExtra("player_list_json");
if (jsonList != null && !jsonList.isEmpty()) {
// 2. 使用 Gson 和 TypeToken 将 JSON 字符串反序列化回 ArrayList<ListeJoueurs>
Gson gson = new Gson();
// 定义目标类型,对于泛型集合,需要使用 TypeToken
Type type = new TypeToken<ArrayList<ListeJoueurs>>() {}.getType();
ArrayList<ListeJoueurs> receivedList = gson.fromJson(jsonList, type);
// 3. 处理接收到的 ArrayList
if (receivedList != null && !receivedList.isEmpty()) {
StringBuilder sb = new StringBuilder("Received Players:\n");
for (ListeJoueurs player : receivedList) {
sb.append(player.toString()).append("\n");
}
receivedDataTextView.setText(sb.toString());
} else {
receivedDataTextView.setText("No players received or list is empty.");
}
} else {
receivedDataTextView.setText("No JSON data received.");
}
}
}在上述代码中:
-keep class com.yourpackage.ListeJoueurs { *; }
# 如果有内部类或匿名类,可能需要更多规则通过本教程,我们学习了如何利用Gson库在Android Activity之间高效且优雅地传递包含自定义对象的ArrayList。这种方法通过将复杂对象结构序列化为JSON字符串,并利用Intent传递该字符串,有效解决了Intent直接传递复杂对象集合的限制。Gson的简单易用性使其成为处理此类数据传递场景的理想选择,大大简化了开发工作。在实际应用中,结合对数据量和性能的考量,选择最适合的数据传递策略至关重要。
以上就是Android Activity间传递自定义对象列表:使用Gson库的实践指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号