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