我正在制作待办事项列表,并且在从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
答案 0 :(得分:0)
您没有正确实施列表视图。列表视图回收视图。这意味着他们重复使用相同的视图,并将列表中的不同位置放入其中。这提供了非常有效的UI代码。这也意味着如果您对适配器的getView之外的视图进行了任何更改,那么当您删除或滚动时,这些更改将应用于错误的项目。
制作列表视图的写入方式是,如果要更新任何位置的UI,可以更改该位置的模型。然后通过调用notifyDataSetChanged()告诉适配器它需要更新。然后将调用getView函数来重绘每个可见元素,并应该应用通过。
答案 1 :(得分:0)
您应该为项目定义一个类,该类具有一个用于警示状态的布尔字段。例如:
$env
然后您可以检查某个项目是否在适配器的public class MyItem{
String name;
boolean isStriked;
}
方法中被删除。您可以通过这种方式增加代码的内聚力。顺便说一下,我建议使用RecyclerView,因为它有项目删除的预定义方法和动画