【发布时间】:2017-04-27 22:52:45
【问题描述】:
这是Android implement Parcelable objects with hashmap that contains another hashmap 的扩展,我在使用 Parcelable 的活动之间传递 2 个类时遇到问题。 我现在可以使用 Parcelable 成功地通过这两个类。但是,我无法将检索到的数据放入数组列表中。
这是 EventDetails 类:
public class MatchedEvent implements Parcelable {
Private String eventId;
Private String eventName;
Private Long eventUnixTime;
Private Map <String, User> attendees = new HashMap<String, User>();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(eventId);
dest.writeString(eventName);
dest.writeLong(eventUnixTime);
final int N = attendees.size();
dest.writeInt(N);
if (N > 0) {
for (Map.Entry<String, User> entry : attendees.entrySet()) {
dest.writeString(entry.getKey());
User user = entry.getValue();
dest.writeString(user.getEmail());
dest.writeString(user.getUserName());
dest.writeString(user.getUserPicture());
}
}
}
protected MatchedEvent(Parcel in) {
eventId = in.readString();
eventName = in.readString();
eventUnixTime = in.readLong();
final int N = in.readInt();
for (int i = 0; i < N; i++) {
String key = in.readString();
User user = new User();
user.email = in.readString();
user.userName = in.readString();
user.userPicture = in.readString();
attendees.put(key, user);
}
}
public Map<String, User> getAttendees() {
return attendees;
}
这是用户类:
public class User implements Parcelable {
public String email;
public String userName;
public String userPicture;
private Boolean hasLoggedInWithPassword;
private HashMap<String, Object> dateJoined = null;
}
public User(Parcel in) {
email = in.readString();
userName = in.readString();
userPicture = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(email);
dest.writeString(userName);
dest.writeString(userPicture);
}
这是检索数据的片段。 EventDetails 类应该返回一些用户。我的目标是在 TextView 中显示所有用户的名称,其中列出了带有换行符的名称。我能够检索数组中的用户,但无法仅为用户名创建数组。
public class EventDetailsFragment extends BaseFragment {
TextView attendees;
private Map<String, User> attendeeMap;
@Override
public void onCreate(Bundle savedInstanceState) {
MatchedEvent matchedEvent = getArguments().getParcelable("eventDetailsData");
attendeesMap = matchedEvent.getAttendees();
List<User> users = new ArrayList<>();
for (String key : attendeesMap.keySet()) {
User user = attendeesMap.get(key);
users.add(user);
Log.i("Attendees Details", String.valueOf(user)); //I was able to get all users in this log.
ArrayList<String> attendeesDetails = new ArrayList<>();
attendeesDetails.add(user.getEmail());
attendeesDetails.add(user.getUserName());
attendeesDetails.add(user.getUserPicture());
for (User user1 : users) {
Log.i("Attendees Details", String.valueOf(attendeesDetails)); //?????????????????
}
}
}
问题是我把标记“//???????????????????”。 我得到重复的数据。我知道我不应该将一个循环放在另一个循环中。有人可以告诉我如何解决这个问题吗?我的目标是将所有用户的姓名放在一个数组中,并在 TextView 中显示,每个姓名后都有一个换行符。
这是我从日志中得到的:
I/Attendees Details: com.test.entities.User@f2b14s9
I/Attendees Details: [user1@gmail.com, Deric, https://dropbox.xxxxxx]
I/Attendees Details: com.test.entities.User@e6s26k2
I/Attendees Details: [user2@gmail.com, Jose, https://dropbox.xxxxxxxxx]
I/Attendees Details: [user2@gmail.com, Jose, https://dropbox.xxxxxxxxx]
I/Attendees Details: com.text.entities.User@b9k03l6
I/Attendees Details: [user3@gmail.com, Matt, https://dropbox.xxxxxxxxxxxxx]
I/Attendees Details: [user3@gmail.com, Matt, https://dropbox.xxxxxxxxxxxxx]
I/Attendees Details: [user3@gmail.com, Matt, https://dropbox.xxxxxxxxxxxxx]
我认为有重复条目的原因是因为“attendeesDetails”在循环“attendeesMap”中,我在其中获取了每个用户的密钥。我不确定如何将它们分开,但仍然能够获取数据。
提前感谢您的帮助。
-R
【问题讨论】:
-
“重复数据”是什么意思?您的
atendeesDetails是一个数组列表,依次包含电子邮件、用户名和图片。我不明白你为什么需要这样。 -
我已经添加了日志中的结果。你知道如何获取每个用户的“姓名”吗?
-
让我再看看。
-
我这样做的方式可能效率不高。这是我第一次处理 Parcelable。 MatchedEvent 类将返回多个用户。这里的目标是让每个用户的名字都显示在 TextView 上。您能否推荐任何其他方法从这两个类的 Parcelable 中获取此信息(无需查看我的代码并忘记我的嵌套“for”循环)?
-
首先我建议你使用 Parceler 库来处理 Parcel。 (我已经对它进行了基准测试,它的性能损失在已经超快的操作上不到 5%),但是处理 Parcelable 变得轻而易举。
标签: java android arrays arraylist parcelable