Java 重新排列ArrayList元素

Java 重新排列ArrayList元素,java,android,sorting,arraylist,Java,Android,Sorting,Arraylist,我有n一系列项目,包括姓名和职位。如果我从列表中删除一行,我想重新排列列表的位置 例如: Vijay 01 Dhas 02 Arun 03 prabhu 04 如果我从列表中删除DHA,Arun的位置应该是02,而prabhu的位置应该是03 我的模范班是 public class Model { private String name; private int position; public Model(String name, int positio

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

例如:

Vijay  01
Dhas   02
Arun   03
prabhu 04
如果我从列表中删除DHA,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();


                }
            }); 
        }
@覆盖
公共无效onBindViewHolder(最终MyViewHolder,最终int位置){
holder.imvDelete.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
int-tempreviousvalue;
for(int i=position;i

但是我没有得到正确的顺序。有人能提出一些重新排列数组的想法吗?

我实际上建议只使用一个简单的名称列表,然后依靠
列表#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
String[]names=新字符串[]{“Vijay”、“Dhas”、“Arun”、“prabhu”};
List=Arrays.asList(名称);
列表。删除(“DHA”);
System.out.println(list.indexOf(“Arun”);//应为1,删除前为2

您也可以使用
列表
,同样的逻辑也适用。我建议您让list API为您维护位置号,它已经这样做了。

只需做一个循环,并使用增量索引作为新位置,如下所示

    mData.remove(position);
    for (int i = 0; i < mData.size(); i++) {
        mData.get(i).setPosition(i);
    }
    notifyDataSetChanged();
public void removeItem(int position){
    // just a safe check
    if(position >= getItemCount() ){
        return;
    }

    mData.remove(position);
    notifyItemRemoved(position);
}
mData.remove(位置);
对于(int i=0;i
或者,如果您在模型中的位置从数字1开始,请使用
.setPosition(i+1)


一件事,不要在recyclerview适配器中使用position,因为它可能有一个错误的号码,请使用
holder.getAdapterPosition()

可能是这样的:

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

其余部分保持不变。

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

创建一个类似这样的方法

    mData.remove(position);
    for (int i = 0; i < mData.size(); i++) {
        mData.get(i).setPosition(i);
    }
    notifyDataSetChanged();
public void removeItem(int position){
    // just a safe check
    if(position >= getItemCount() ){
        return;
    }

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

然后调用并传递要删除的位置。

下面是一个使用
Java8
streams的位置:

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


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

只要在activity/fragment/中,而不是在adapter中,将其删除,就可以调用
adapter.notifyDataSetChanged()
从列表中删除项目后,只需将
item.setPosition(list.indexOf(item))
设置为列表中项目的位置。如果从列表中删除项目,它将自动更新位置,您无需执行任何操作。你到底想实现什么?@MaksimNovikov列表位置将改变。但是在我的模特位置我需要改变。@VijayDhas模特位置的目的是什么?我不能使用普通列表。我在上模型课。我需要在模型课上做些改变,但不会改变我的答案。在我的回答中,您可以将
字符串
替换为
模型
。列表API已经完成了维护位置的工作,您应该使用它。我在模型中有位置。我将从服务器获取它。例如座位安排,我有10个座位。第一个席位分配给Vijay,第二个席位分配给DHA,就像分配给wise 10个席位一样。如果我删除第5个座位的人,第6个座位的人应该分配到第5个座位,最多需要换10个座位。所以我想改变一下模式。不在列表中…但要更改模型,您必须更改数据源,即您的列表。我在模型中占有一席之地。我将从服务器获取它。例如座位安排,我有10个座位。第一个席位分配给Vijay,第二个席位分配给DHA,就像分配给wise 10个席位一样。如果我删除第5个座位的人,第6个座位的人应该分配到第5个座位,并且需要最多更改10个座位。上面的代码将执行此操作,但在适配器外部执行此操作,让我们更改主源,而不是适配器中的源。为清楚起见,您还应该删除主数据源上的一个位置,而不仅仅是适配器中的位置。我将是mdata位置。我想用以前的值更新mdata.setposition。简单地说,你想按顺序交换这些值。@grabarz121为什么要在删除模型后添加模型?我想你真的不知道,你想实现什么。谢谢Kavin。效果很好。我暂时将此作为解决方案。但是,如果我收到诸如新模型(“第1项”,第12项)、新模型(“第2项”,第10项)、新模型(“第3项”,第12项)、新模型(“第4项”,第44项)、新模型(“第5项”,第35项)、新模型(“第6项”,第99项)、新模型(“第7项,第54项”)之类的输入,我们将陷入困境。有什么办法解决这个问题吗?为此,我尝试交换值。请让我知道。@VijayDhas关于你给出的例子。当我们移除型号
项目4
(位置
44
)时,它会变成什么?它会变成
[{Item 1,12},{Item 2,10},{Item 3,12},{Item 5,44},{Item 6,35},{Item 7,99}]
,或者这些项目会首先按位置排序,所以当删除位置
[{Item 2,10},{Item 1,12},{Item 3,12},{Item 5,35},{Item 7,44},{Item 6,54}时它会变成
?最后一个值也被删除是什么意思?我在问当你删除
{Item 4',44}
-Model.Older列表:
{Item 1',12},{Item 2',10},{Item 3',12},{It