Переупорядочить элементы ArrayList - PullRequest
0 голосов
/ 31 января 2019

У меня есть n номер списка предметов, содержащий имя и должность.Если я удаляю строку из списка, я хочу изменить расположение списка.

Например:

Vijay  01
Dhas   02
Arun   03
prabhu 04

Если я удаляю Dhas из списка, позиция Аруна должна быть 02, а позиция прабху должна быть 03.

Мой класс модели

public class Model {

    private String name;
    private int position;

    public Model(String name, int position) {
        this.name = name;
        this.position = position;

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

}

Я попробовал следующее:

 @Override
        public void onBindViewHolder(final MyViewHolder holder, final int position) {
            holder.imvDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    int tempPreviousValue;
                    for(int i = position ; i < mData.size()-1 ; i++){
                        int deletedPosition = mData.get(i).getPosition();
                        tempPreviousValue = mData.get(position+1).getPosition();
                        mData.get(position+1).setPosition(deletedPosition);
                    }
                    mData.remove(position);
                    notifyDataSetChanged();


                }
            }); 
        }

Но я не получаю правильный заказ.Кто-нибудь может дать какие-нибудь идеи по перестановке массива?

Ответы [ 7 ]

0 голосов
/ 31 января 2019

Создайте метод, подобный этому

public void removeItem(int position){
    // just a safe check
    if(position >= getItemCount() ){
        return;
    }

    mData.remove(position);
    notifyItemRemoved(position);
}

, затем вызовите и передайте позицию, которую вы хотели удалить.

0 голосов
/ 31 января 2019

Вот один из них, использующий Java8 streams:

List<String> l2 = list.stream().filter(a -> !a.equals("Dhas")).collect(Collectors.toList());

Обратите внимание, что это создаст новый список.

0 голосов
/ 31 января 2019
       @Override
        public void onBindViewHolder(final MyViewHolder holder, final int position) {
            holder.imvDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    for (int i=mData.size()-1;i>position;i--){
                        mData.get(i).setPosition(mData.get(i-1).getPosition());
                    }
                    mData.remove(position);
                    notifyDataSetChanged();
                }
            });
        }
0 голосов
/ 31 января 2019

вам просто нужно обновить адаптер с помощью notifyDataSetChanged(); и написать такой код: -

@Override
        public void onBindViewHolder(final MyViewHolder holder, final int position) {
            mData.get(position).setPosition(position);
        }

и добавить еще один метод для удаления элемента из адаптера.

public void remove_item(int position) {
       mData.remove(position);
        notifyDataSetChanged();
    }
0 голосов
/ 31 января 2019

Может быть что-то вроде этого:

int positionToDelete = 2;
Model modelToDelete = modelList.get(positionToDelete - 1);
modelList.remove(modelToDelete);
for(int i = positionToDelete - 1; i < modelList.size(); i++){
  Model modelToChange = modelList.get(i);
  modelToChange.setPosition(modelToChange.getPosition() - 1);
}

Список будет таким перед удалением:

[{name = Vijay, position = 1},
 {name = Dhas, position = 2},
 {name = Arun, position = 3},
 {name = prabhu, position = 4}]

И таким после удаления:

[{name = Vijay, position = 1},
 {name = Arun, position = 2},
 {name = prabhu, position = 3}]

Попробуйте онлайн.

Или, если вы уже знаете модель, которую хотите удалить, первые две строки будут такими:

Model modelToDelete = ...; // Model retrieved from some place
int positionToDelete = modelToDelete.getPosition();

остальное остается прежним.

0 голосов
/ 31 января 2019

Просто сделайте цикл и используйте индекс приращения в качестве новой позиции, например, такой:

    mData.remove(position);
    for (int i = 0; i < mData.size(); i++) {
        mData.get(i).setPosition(i);
    }
    notifyDataSetChanged();

Или, если ваша позиция в модели начинается с цифры 1, используйте .setPosition(i+1).
Во-первых, не используйте позицию в адаптере утилита просмотра, потому что это может иметь неправильный номер, используйте holder.getAdapterPosition();.

0 голосов
/ 31 января 2019

Я действительно рекомендую просто использовать простой список имен, а затем полагаться на List#indexOf, чтобы найти позиции.

String[] names = new String[] { "Vijay", "Dhas", "Arun", "prabhu" };
List<String> list = Arrays.asList(names);
list.remove("Dhas");
System.out.println(list.indexOf("Arun"));  // should be 1, was 2 before deletion

Вы также можете использовать List<Model>, и применяется та же логика.Я выступаю за то, чтобы вы позволили API списка поддерживать номер позиции для вас, что он уже делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...