我有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();
}
});
}
但是我没有得到正确的订单。任何人都可以提出一些想法来重新排列数组吗?
答案 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}]
或者,如果您已经知道要删除的模型,则前两行是:
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());
请注意,这将创建一个新的列表。