我正在为ListView使用自定义适配器,为每个列表项扩展布局。对于每个列表项,布局中都有一个按钮,允许用户从列表视图中删除该项。还有一个用户输入的编辑文本。我遇到的问题是,当填充编辑文本时,然后用户删除该项目时,该值将转移到其下方列表项的编辑文本。例如,如果我的列表视图中位置1的编辑文本中的值为“25”,则用户单击以删除该项,值“25”将转移到位置1中的新项目。
我的适配器类
public class PartOrderAddPartAdapter extends ArrayAdapter<Part> {
private static final int layoutResourceId = R.layout.part_information_list_item;
private List<Part> partList;
private final Context context;
public PartOrderAddPartAdapter(Context context, List<Part> partList) {
super(context, layoutResourceId, partList);
this.context = context;
this.partList = partList;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater inflater = LayoutInflater.from(context);
view = inflater.inflate(layoutResourceId, null);
}
Part p = getItem(position);
TextView partNumber = (TextView) view.findViewById(R.id.part_number);
TextView partDescription = (TextView) view.findViewById(R.id.part_description);
EditText quantity = (EditText) view.findViewById(R.id.quantity);
Button removePartButton = (Button) view.findViewById(R.id.remove_part_button);
partNumber.setText(p.getPartNumber());
partDescription.setText(p.getDescription());
removePartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
partList.remove(position);
notifyDataSetChanged();
}
});
return view;
}
@Override
public Part getItem(int position) {
return partList.get(position);
}
}
答案 0 :(得分:1)
您需要记住重复使用该行的视图。 当存在未使用的存储时,它不会创建新的。您可以在convertView中接收它以进行重新填充 - 正如您在自己的代码中看到的那样。
所以,如果那里有一个先前的值那么它仍将存在。 由你来清除它。
简而言之,您必须为行中的所有字段设置值。你无法假设那里的价值。
答案 1 :(得分:0)
在重复使用视图时,对视图所做的任何更改在重用时都会显示(即滚动或刷新列表时)。在您的情况下,您将从列表中删除该项目,但不从视图中清除文本。当你调用notifyDataSetChanged()并且文本仍然可见时,视图会向上移动。
您需要做的是在调用notifyDataSetChanged()之前清除该位置视图中的文本。
需要注意的另一件事是在重用列表适配器中的视图时使用条件语句。简而言之,在语句的计算结果为false时,请始终使用if和else来确保将视图重置为默认状态。