重新排列ArrayList元素

时间:2019-01-31 07:45:00

标签: java android sorting arraylist

我有n个项目列表,其中包含名称和职位。如果我从列表中删除一行,我想重新排列列表的位置。

例如:

Vijay  01
Dhas   02
Arun   03
prabhu 04

如果我从列表中删除Dhas,则Arun的位置应为02,而prabhu的位置应为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 :(得分:2)

我实际上建议仅使用简单的名称列表,然后依靠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维护您的职位编号,这已经做到了。

答案 1 :(得分:0)

只需循环,然后使用增量索引作为新位置

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

或者如果您在模型中的位置从数字1开始,请使用.setPosition(i+1)
一件事,不要在recyclerview适配器中使用位置,因为它的编号可能错误,请改用holder.getAdapterPosition();

答案 2 :(得分:0)

也许是这样的:

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}]

Try it online.

或者,如果您已经知道要删除的模型,则前两行是:

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

其余部分保持不变。

答案 3 :(得分:0)

您只需要使用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();
    }

答案 4 :(得分:0)

       @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();
                }
            });
        }

答案 5 :(得分:0)

创建类似这样的方法

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

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

然后致电并传递您想要删除的职位。

答案 6 :(得分:0)

下面一个使用是Java8流:

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

请注意,这将创建一个新的列表。