繁体   English   中英

重新排列 ArrayList 元素

[英]Re-arrange ArrayList elements

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


                }
            }); 
        }

但我没有得到正确的顺序。 任何人都可以给出一些重新排列数组的想法吗?

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

只需做一个循环,并像这样使用增量索引作为新位置

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

或者,如果您在模型中的位置从数字 1 开始,请使用.setPosition(i+1)
一件事,不要在 recyclerview 适配器中使用位置,因为这可能有一个错误的数字,使用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();刷新 Adapter 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();
    }
       @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();
                }
            });
        }

创建一个类似这样的方法

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

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

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

这是使用Java8流的一个:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM