【问题标题】:Use IndexOf within Getter/Setter (mulitdimensional) Arraylist将 IndexOf 与 Getter/Setter(多维)Arraylist 一起使用
【发布时间】:2018-11-12 16:48:02
【问题描述】:

框架:

通过 Recyclerview 上的 onClicklistener,我将项目添加到 Arraylist。归根结底,我使用以下三行来完成:

int typeImage = mContext.getResources().getIdentifier("introcreeps", "drawable", mContext.getPackageName());
mDecklist.add(new Decklist(mData.get(position).getCardImage(),typeImage, "22", mData.get(position).getCardName(), "x1");
mRViewAdapterList.setCards(mDecklist);

问题:

使用另一个 OnclickListener,我想编辑 mDecklist 的元素。 我认为这应该是可能的

positionToEdit = mDecklist.indexOf(mData.get(position).getCardName());
mDecklist.set(positionToEdit, new Decklist(mData.get(position).getCardImage(),typeImage, "22", mData.get(position).getCardName(), "x2" ));

我知道positionToEdit = mDecklist.indexOf(mData.get(position).getCardName()); 显然是错误的。我必须传递什么样的对象才能找到正确的位置?

什么也不起作用:

CardNames 在我的 Arraylist 中将是不同的,因此我想通过使用它来找到位置。我也尝试使用整个 ArraylistObject 的东西,但这对我来说不起作用,比如:

positionToEdit = mDecklist.indexOf(Decklist(mData.get(position).getCardImage(),typeImage, "22", mData.get(position).getCardName(), "x1"));

更多信息:

以下是我的 Arraylist (Decklist) 的代码: 包 com.example.chris.projectartifact.b_deckbuilderTap;

公开课牌组{

private int CardImage;
private int TypeImage;
private String Cost;
private String Name;
private String Number;


public Decklist(int cardImage, int typeImage, String cost, String name, String number) {
    /* Why is there no this. ? */
    CardImage = cardImage;
    TypeImage = typeImage;
    Cost = cost;
    Name = name;
    Number = number;
}

public Decklist(String cost, String name, String number) {
    Cost = cost;
    Name = name;
    Number = number;
}

public int getCardImage() {
    return CardImage;
}

public void setCardImage(int cardImage) {
    CardImage = cardImage;
}

public int getTypeImage() {
    return TypeImage;
}

public void setTypeImage(int typeImage) {
    TypeImage = typeImage;
}

public String getCost() {
    return Cost;
}

public void setCost(String cost) {
    Cost = cost;
}

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public String getNumber() {
    return Number;
}

public void setNumber(String number) {
    Number = number;
}

}

更多信息基于帖子问题: 为了让您了解我想要做什么,我将发布我使用 mData 和 mDecklist 的 Recyclerviews 的屏幕截图:

让我用颜色来解释一下:

  • orange Recyclerview 使用 mData 来扩充 Recyclerview。基于 orange Recyclerview 中带圆圈的 green 按钮,我们将 mData 的值设置为一个名为 mDecklist 的新 Arraylist。
  • mDecklist 在绿色 Recyclerview 中用于创建新值,因此我们可以将第一个 Recyclerview(橙色)中的项目添加到第二个 Recyclerview(绿色)
  • 但它变得更加复杂!当我们在 Yellow 中使用 Spinners 时,Orange Recyclerview 正在从数据库中获取一个全新的 mData 文件。 这意味着这些位置(基本上)被覆盖了。
  • 因此,get(position) 是不够的!#
  • 每个 mDecklist 都将使用与 mData 中的卡片相同的名称(例如 CardName 是 Bloodseeker,也将在 mDecklist 中使用)。因此,我希望可以通过使用名称作为搜索参考,在 mDecklist 中找到 Object 的位置。

非常欢迎任何帮助! :)

【问题讨论】:

  • mData 和 mDeckList 是否相同?
  • mData 和 mDecklist 是两个不同的列表。但我使用 mData 的值来创建 mDecklist。如您所见,第一个值 (cardImage) 也用于 mData,但我在 mDecklist 中也需要它。所以不,它们不相同。
  • 请查看我在帖子中所做的编辑。它应该更有说服力地解释这个问题。 :)

标签: android android-studio object arraylist indexof


【解决方案1】:

覆盖Declist类中的equals()和hashCode()方法(android studio可以自动生成)。那么mDecklist.indexOf(mData.get(position)) 将返回正确的索引当且仅当 mData.get(position) 返回包含在mDecklist 中的Decklist 对象

class Decklist {

private int CardImage;
private int TypeImage;
private String Cost;
private String Name;
private String Number;


public Decklist(int cardImage, int typeImage, String cost, String name, String number) {
    /* Why is there no this. ? */
    CardImage = cardImage;
    TypeImage = typeImage;
    Cost = cost;
    Name = name;
    Number = number;
}

public Decklist(String cost, String name, String number) {
    Cost = cost;
    Name = name;
    Number = number;
}

public int getCardImage() {
    return CardImage;
}

public void setCardImage(int cardImage) {
    CardImage = cardImage;
}

public int getTypeImage() {
    return TypeImage;
}

public void setTypeImage(int typeImage) {
    TypeImage = typeImage;
}

public String getCost() {
    return Cost;
}

public void setCost(String cost) {
    Cost = cost;
}

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public String getNumber() {
    return Number;
}

public void setNumber(String number) {
    Number = number;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + CardImage;
    result = prime * result + ((Cost == null) ? 0 : Cost.hashCode());
    result = prime * result + ((Name == null) ? 0 : Name.hashCode());
    result = prime * result + ((Number == null) ? 0 : Number.hashCode());
    result = prime * result + TypeImage;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Decklist other = (Decklist) obj;
    if (CardImage != other.CardImage)
        return false;
    if (Cost == null) {
        if (other.Cost != null)
            return false;
    } else if (!Cost.equals(other.Cost))
        return false;
    if (Name == null) {
        if (other.Name != null)
            return false;
    } else if (!Name.equals(other.Name))
        return false;
    if (Number == null) {
        if (other.Number != null)
            return false;
    } else if (!Number.equals(other.Number))
        return false;
    if (TypeImage != other.TypeImage)
        return false;
    return true;
}
}

【讨论】:

  • 天哪,兄弟。谢谢,我稍后会尝试使用它。您能否详细说明您在使用哈希码和等号做什么?我试着读一些关于哈希码的东西会在公共汽车上;)
  • @Christian.gruener 查看link了解详情
  • 嘿乌默尔。我试图读懂你试图做什么。我有一个问题和一个问题要提出。首先你是说(android studio可以自动创建覆盖),你能解释一下你是怎么做到的吗?其次,代码不起作用。正如我试图用我的帖子中的屏幕截图解释的那样,mData.get(position) 从来都不是 mDecklist 的对象。我使用 mData 填充 mDecklist,mDecklist 的每个对象(例如)都有一个带有 mData.get(position).getCardName 的条目,但它们并不相同。您能否再给我一个提示如何解决我的问题?
  • 嘿 Umer,我不知道这对你来说是否可行,但你能接受我的回答,所以这个线程关闭了吗? :)
  • @Christian.gruener 我认为您的问题下会有一个选项可以关闭它。
【解决方案2】:

Umer 提出的自 mData.get(position) (第一个数组列表)以来不起作用的建议永远不会是 mDecklist 的对象,如上所述。但我能够找到解决我的问题的另一种方法:

我正在使用 mDecklist 的 Getter 方法来解决我的问题。基本上这一切都归结为几行。它们并不漂亮,但解决了我的问题:

for (int i = 0; i < mDecklist.size(); i++) {
                    if (mData.get(position).getCardName().equals(mDecklist.get(i).getName())){
                        Log.e("Print Out:", mDecklist.get(i).getName());
                        Log.e("Print Out:", "That worked");
                        mDecklist.get(i).setName("we can e.g. change the name");
                    }
                }

非常感谢您的建议和阅读!

【讨论】:

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