Используйте IndexOf в Getter / Setter (многомерном) Arraylist - PullRequest
0 голосов
/ 12 ноября 2018

Framework:

Через onClicklistener в Recyclerview я добавляю Предметы в 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;

публичный класс 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;
}

}

Дополнительная информация на основе почтовых вопросов: Чтобы дать вам представление о том, что я хочу сделать, я опубликую скриншот моих обзоров Recycler, использующих mData и mDecklist: RecyclerViews

Позвольте мне объяснить, используяцвета:

  • оранжевый Recyclerview использует mData для раздувания Recyclerview.На основе обведенной кружком кнопки green в orange Recyclerview мы присваиваем значения mData новому Arraylist с именем mDecklist.
  • mDecklist используется в зеленом Recyclerview для создания новогоЗначения, следовательно, мы можем добавлять элементы из первого Recyclerview (оранжевого) в secound Recyclerview (зеленого цвета)
  • Но это становится немного сложнее!Когда мы используем Spinners в Yellow , Orange Recyclerview равен , получая совершенно новый файл mData из базы данных. Это означает, что позиции (в основном) перезаписаны.
  • Следовательно, get (position) недостаточно! #
  • Каждый mDecklistбудет использовать то же имя, что и карта в mData (например, CardName - это Bloodseeker, который также будет использоваться в mDecklist).Поэтому я надеялся, что можно было бы найти положение Объекта в mDecklist, используя Имя в качестве ссылки для поиска.

Любая помощь очень приветствуется!:)

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Предложение Умера, что оно не работает с mData.get(position) (первый массив), никогда не будет объектом mDecklist, как объяснено выше. Но мне удалось найти другое решение моей проблемы:

Я использую Методы получения mDecklist для решения моей проблемы . В основном все сводится к нескольким строкам. Они не красивые, но решают мою проблему:

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");
                    }
                }

В любом случае, большое спасибо за предложения и за чтение!

0 голосов
/ 13 ноября 2018

Переопределить equals() и hashCode() методы в классе Declist (android studio может генерировать автоматически). Тогда mDecklist.indexOf(mData.get(position)) вернет правильный индекс тогда и только тогда, когда mData.get(position) вернет Decklist объект, содержащийся в mDecklist

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;
}
}
...