Android Studio,删除 ListView 项而不影响其他项
Android Studio, Remove ListView Item without affecting another Item
我正在制作待办事项列表,但无法从 ListView 中删除项目。
如果用户在他的清单上做了一件事,他可以点击该项目,它要么被划线,要么撤消划线:
lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView tv = (TextView) view;
int i_strikethrough = tv.getPaintFlags();
if(i_strikethrough == 1297){
tv.setPaintFlags(tv.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
} else if (i_strikethrough == 1281){
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
}
}
});
如果用户长按,会弹出一条消息,他可以选择删除此项:
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle("Delete");
alertDialogBuilder.setMessage("Are you sure you want to delete?");
alertDialogBuilder.setCancelable(false);
alertDialogBuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
adapterInhalt.remove(adapterInhalt.getItem(position));
}
});
alertDialogBuilder.setNegativeButton("No", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
dialogInterface.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
return true;
}
});
现在,我的问题如下:
假设第二个项目被删除,但第三个没有。
如果我删除第二个项目,那么第三个项目在第二位并被删除。但它不应该被删除。
希望您能理解我的问题并帮助我解决这个问题。
希望这张图片能帮助您理解问题:
A helping Picture
您没有正确实现列表视图。列表视图回收视图。这意味着他们会重复使用相同的视图并将列表中的不同位置放入其中。这提供了非常高效的 UI 代码。这也意味着,如果您在适配器的 getView 之外对视图进行任何更改,那么当您删除或滚动时,这些更改将应用于错误的项目。
做成listview的写法是,如果要更新任何位置的UI,就改变那个位置的model。然后您通过调用 notifyDataSetChanged() 告诉适配器它需要更新。然后将调用 getView 函数来重绘每个可见元素,并且应该应用删除线。
您应该为您的商品定义一个 class,它有一个表示罢工状态的布尔字段。例如:
public class MyItem{
String name;
boolean isStriked;
}
然后您可以在适配器的 getView()
方法中检查某个项目是否被删除线。您可以通过这种方式增加代码的凝聚力。顺便说一句,我建议使用 RecyclerView,因为它具有用于项目删除的预定义方法和动画
我正在制作待办事项列表,但无法从 ListView 中删除项目。
如果用户在他的清单上做了一件事,他可以点击该项目,它要么被划线,要么撤消划线:
lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView tv = (TextView) view;
int i_strikethrough = tv.getPaintFlags();
if(i_strikethrough == 1297){
tv.setPaintFlags(tv.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
} else if (i_strikethrough == 1281){
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
}
}
});
如果用户长按,会弹出一条消息,他可以选择删除此项:
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle("Delete");
alertDialogBuilder.setMessage("Are you sure you want to delete?");
alertDialogBuilder.setCancelable(false);
alertDialogBuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
adapterInhalt.remove(adapterInhalt.getItem(position));
}
});
alertDialogBuilder.setNegativeButton("No", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
dialogInterface.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
return true;
}
});
现在,我的问题如下:
假设第二个项目被删除,但第三个没有。
如果我删除第二个项目,那么第三个项目在第二位并被删除。但它不应该被删除。
希望您能理解我的问题并帮助我解决这个问题。
希望这张图片能帮助您理解问题: A helping Picture
您没有正确实现列表视图。列表视图回收视图。这意味着他们会重复使用相同的视图并将列表中的不同位置放入其中。这提供了非常高效的 UI 代码。这也意味着,如果您在适配器的 getView 之外对视图进行任何更改,那么当您删除或滚动时,这些更改将应用于错误的项目。
做成listview的写法是,如果要更新任何位置的UI,就改变那个位置的model。然后您通过调用 notifyDataSetChanged() 告诉适配器它需要更新。然后将调用 getView 函数来重绘每个可见元素,并且应该应用删除线。
您应该为您的商品定义一个 class,它有一个表示罢工状态的布尔字段。例如:
public class MyItem{
String name;
boolean isStriked;
}
然后您可以在适配器的 getView()
方法中检查某个项目是否被删除线。您可以通过这种方式增加代码的凝聚力。顺便说一句,我建议使用 RecyclerView,因为它具有用于项目删除的预定义方法和动画