【问题标题】:Android put data retrieved from Parcelable into an arrayAndroid 将从 Parcelable 检索到的数据放入一个数组中
【发布时间】: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


【解决方案1】:

这将对您有所帮助:

              @Override
              public void onCreate(Bundle savedInstanceState) {

              EventDetails eventDetails = getArguments().getParcelable("eventDetailsData");

              attendeesMap = eventDetails.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.

attendees.append(user.getEmail()+user.getUserName()+user.getUserPicture()+"\n");

              }

【讨论】:

  • 嗨,Mortadda,它返回一个“null”值。我的目标是显示每个用户的姓名。
【解决方案2】:

我想我已经解决了这个问题。我实际上需要先创建一个ArrayList&lt;HashMap&lt;String, String&gt;&gt; 来存储每个用户的详细信息。然后,我将能够创建另一个数组列表来存储名称。没有更多的嵌套循环。

List<User> users = new ArrayList<>();
ArrayList<HashMap<String, String>> userArrayList = new ArrayList<HashMap<String, String>>();
HashMap<String, String> usersDetailsHashMap = new HashMap<String, String>();
ArrayList attendeesNames = new ArrayList();

for (String key : attendeesMap.keySet()) {
    User user = attendeesMap.get(key);
    users.add(user);

    usersDetailsHashMap.put("name", user.getUserName());
    usersDetailsHashMap.put("email", user.getEmail());
    usersDetailsHashMap.put("picture", user.getUserPicture());

    userArrayList.add(usersDetailsHashMap);

    attendeesNames.add(userArrayList.get(0).get("name"));

}

Log.i("userNames", String.valueOf(attendeesNames));

这将在日志中返回:

[Deric, Jose, Matt]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多