如何通过自定义行中的删除按钮更新我的列表视图?

How can I update my Listview from a Delete button in my custom row?

我为我的 ListView 构建了一个自定义行,它显示了用户购物车的内容。我添加了一个按钮,以便他们可以删除他们想要的任何行。我的适配器启动代码如下。

public class CartDetailAdapter extends ArrayAdapter<CartDetail> {
    Context context;
    int layoutResourceId;
    CartDetail data[] = null;

    public CartDetailAdapter(Context context, int layoutResourceId, CartDetail[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

您可以看到我的数据属于 CartDetail 类型,它是一个 class,它列出了我的自定义行中的所有项目。我为 removeBttn 设置的代码在 getView() 中设置。

holder.removeBttn = (Button)row.findViewById(R.id.removeBttn);
holder.removeBttn.setTag(position);

holder.removeBttn.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        Integer index = (Integer) finalHolder.removeBttn.getTag();
        data.remove(index.intValue());
        notifyDataSetChanged();
    }
});

因为我的数据变量是 CartDetail[] 类型而不是 ArrayList,所以我不能使用 remove 从我的列表中删除该项目。如何从 CartDetail[] 中删除商品,是否需要创建自己的方法?

您应该使用 ArrayList 而不是 CartDetail 数据[]

此外,您已经在视图中设置了标签,因此您可以在片段中使用点击侦听器并从列表数组中删除项目并通知适配器上的数据集更改为:

覆盖适配器中的通知方法:

public void notifyDataSetChanged(List<CartDetail> items){
   this.list = items;
   super.notifyDataSetChanged();
}

来自片段:

  View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //remove element using v.getTag() from array.
            notifyDataSetChanged(dataset) // new data set
        }
    };

使用 ArrayList 而不是普通数组,因为普通数组不能从中删除任何数据,但 ArrayList 可以使用它并在适配器中编写删除函数 class

public void deleteEntry(int position){
    arrayList.remove(position);
    notifyDataSetChanged();
}

调用此函数删除例如:

adapter.delete(1);

在您的代码中执行此操作,希望对您有所帮助。

holder.removeBttn = (Button)row.findViewById(R.id.removeBttn);
holder.removeBttn.setTag(position);

holder.removeBttn.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        data.remove(position);
        data.trimToSize();
        CartDetailAdapter.this.notifyDataSetChanged();
    }
});

也许您可以删除您的行。试试这个。

Array Adapter 在内部将 Array 维护为 ArrayList。所以你可以直接在你的 Adapter 对象上调用 remove(Object o)。

不要忘记在删除对象后调用适配器对象上的 notifyDataSetChanged。

你不能真正从数组中删除数据,所以我建议改用ArrayList,但如果你坚持你可以使用这个方法。

List<CardDetail> list = new ArrayList<CardDetail>(Arrays.asList(data));
list.remove(position);
data = list.toArray();