【问题标题】:Android List<> Save new objects which are equal to previous objectAndroid List<> 保存与前一个对象相等的新对象
【发布时间】:2021-01-17 05:03:44
【问题描述】:

所以我正在尝试将自定义对象(成员)添加到

final List<Member[]> membersAdded = new ArrayList<>();

通过调用这个方法

 public void AddMember(Member member) {
    member.setAmountInShare(bcAmount);
    Member[] x = new Member[]{member};
    membersAdded.add(x);
    membersAddedCounter++;
    addAdapter.notifyDataSetChanged();

    if(membersAdded.get(0)[0] == membersAdded.get(membersAdded.size()-1)[0]){
        Log.d("Test", "same "+(membersAdded.size()-1));
    }

    if (membersAdded.size() > 0) hintTextView.setVisibility(View.GONE);
    else hintTextView.setVisibility(View.VISIBLE);
}

该列表包含对象(成员)的数组,因此我可以在需要时在数组中添加更多对象。 所以让我有 5 个对象,

Member member1 = new Member();
Member member2 = new Member();
Member member3 = new Member();
Member member4 = new Member();
Member member5 = new Member();

当我添加通话时

AddMember(member1)

日志返回相同,因为它们是但是当我这样做时

AddMember(member1)
AddMember(member2)
AddMember(member3)
AddMember(member4)
AddMember(member5)
AddMember(member1)

日志返回 第一次运行 相同的 在最后一次运行 一样的

这里有什么问题?

【问题讨论】:

  • 技术上没有问题。你首先添加member1,所以当你最后调用它时,它会检查membersAdded.get(0)[0] == membersAdded.get(membersAdded.size()-1)[0],这是真的。由于您添加的第一个成员是member1,当前是member1。你想达到什么目的?如果您的数组和列表中都没有多个成员,为什么还需要列表中的成员数组?
  • 好吧,它是 recyclerview 的一个简单行,但它具有将多行组合成一个更大行的功能,我知道它第一次返回相同的 IK 为什么但是当我再次添加相同的对象时仍然返回相同,由于某种原因,我认为它不能按照按值传递而是按引用传递。
  • 首先忘记按值传递或按引用传递,Java 总是按值传递,但这不是重点。就像我在之前的评论中告诉你的那样,当你第一次添加 member1 时,它会创建一个包含 member1 的新数组。之后,它会检查其他成员是否相等,并且当您添加(再次)member1 时,您会检查 membersAdded.get(0)[0](因此列表中添加的第一个元素 member1)是否等于 @987654335 @ 这是添加的最后一项 member1。这是同一个对象,所以它们是相等的。
  • 您创建Member member1 = new Member();,无论您将这个对象传递到何处,它仍然是member1,无论您是否将它放在数组列表或其他任何东西中。您不是在创建一个新对象,而是在使用同一个对象。
  • "该列表包含对象(成员)的数组,因此我可以在需要时在数组中添加更多对象。" 你确定吗?您的数组是通过 Member[] x = new Member[]{member}; 创建的,这意味着它的长度为 1,并且数组的长度永远不会改变,因此您没有更多的空间来 add 新元素,但最终 replace 现有的。如果您需要可以随着添加到其中的元素数量而增长的数组,请改用 List。

标签: java android arrays list


【解决方案1】:

我通过从另一个列表中选择行项目来添加行就像这样,

    holder.cardView.setOnClickListener(v -> {
        Member x = memberList.get(position);
        x.setPositionInBc(counter);
        counter++;
        bcAddMembersFragment.AddMember(x);
        Toast.makeText(bcAddMembersFragment.getContext(), "Member Added", 
        Toast.LENGTH_SHORT).show();
    });

由于某种原因(成员 x)从第二个列表中获取对象的引用,所以我创建了成员对象和 vollah 的新构造函数。

我为解决这个问题所做的是

    holder.cardView.setOnClickListener(v -> {
        Member x = memberList.get(position);
        Member tempMember = new Member(x.getId(), x.getName(), x.getContactNumber(), 
            x.getStatus().toString());
        tempMember.setPositionInBc(counter);
        counter++;
        bcAddMembersFragment.AddMember(tempMember);
        Toast.makeText(bcAddMembersFragment.getContext(), "Member Added", 
            Toast.LENGTH_SHORT).show();
    });

【讨论】:

  • 这不是出于某种原因。请尝试理解我们告诉您的内容。当您创建一个对象并将其放入列表或数组中时,它不会创建该对象的新实例,而是将对象的实例存储在您的列表或数组中。因此,如果您决定在数组或列表中存储相同的对象,这将是相同的对象。如果您想存储与之前的值不同的对象,您可以像在此处所做的那样。
  • 会员会员=新会员();会员 会员1 = 会员; Member2 = member,我想如果我更改 member1,它不会影响 member2,但确实如此。
  • 当然你有 一个 Member 的实例 -> Member member = new Member(); 所以如果你这样做 Member member1 = member;member1 现在是对象member。因此,如果您修改 member1,您将修改 member,因为它们是 samemember2 也一样,你永远不会为 member1member2 创建新实例,你只是说 member1member2member。如果您使用了Member member1 = new Member();member1member 将会不同
  • 啊,很好,这是一个很好的解释,谢谢伙计。
  • @PhilippeB。我终于明白你的意思了,我已经切换到 Angular 11-12 并且我正在使用它,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2023-03-04
  • 2018-01-12
  • 2012-03-07
相关资源
最近更新 更多