利用客户适配器的ListView将文本值从删除的项目转移到下一个项目

时间:2017-02-27 19:17:42

标签: android listview android-arrayadapter

我正在为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);
}
}

2 个答案:

答案 0 :(得分:1)

您需要记住重复使用该行的视图。 当存在未使用的存储时,它不会创建新的。您可以在convertView中接收它以进行重新填充 - 正如您在自己的代码中看到的那样。

所以,如果那里有一个先前的值那么它仍将存在。 由你来清除它。

简而言之,您必须为行中的所有字段设置值。你无法假设那里的价值。

答案 1 :(得分:0)

在重复使用视图时,对视图所做的任何更改在重用时都会显示(即滚动或刷新列表时)。在您的情况下,您将从列表中删除该项目,但不从视图中清除文本。当你调用notifyDataSetChanged()并且文本仍然可见时,视图会向上移动。

您需要做的是在调用notifyDataSetChanged()之前清除该位置视图中的文本。

需要注意的另一件事是在重用列表适配器中的视图时使用条件语句。简而言之,在语句的计算结果为false时,请始终使用if和else来确保将视图重置为默认状态。