在 CustomAdapter 中调用 BaseAdapter 的 notifyDataSetChanged() 不刷新 ListView

calling BaseAdapter's notifyDataSetChanged() inside CustomAdapter not refreshing ListView

我有 ArrayList<MyObject> data 使用 CustomAdapter.

ListView 上填充

我在 CustomAdapter class 中实现了 View.OnClickListener,单击按钮删除特定行。在自定义适配器中使用 data.remove(i) 从数据库和 data 对象删除行后,我调用 notifyDataSetChanged().

问题是它不刷新ListView

我正在使用带有片段的选项卡 activity。因此,当转到某个遥远的选项卡并返回此选项卡时,它会刷新 ListView 并且已删除的项目不再显示。

为什么当我调用 notifyDataSetChanged()ListView 没有立即刷新,但当我移动到另一个片段并返回时发生变化?

我的CustomAdapterclass如下:

public class CustomAdapter extends BaseAdapter implements View.OnClickListener {

    private LayoutInflater mInflater;
    Context context;
    private ArrayList<MyObject> data;

    public CustomAdapter(Context context, ArrayList<MyObject> data) {
        mInflater = LayoutInflater.from(context);
        this.data = data;
        this.context = context;
    }
    .....
    .....
    .....
    .....
    .....

    @Override
    public void onClick(View v) {
        DataBaseHelper db = new DataBaseHelper(context);
        int id = data.get((Integer) v.getTag()).id;
        //use getTag() to get the position, set position in tag before adding listener.
        switch (v.getId()){
            case R.id.txtName:
                Toast.makeText(context, "Show Details" + v.getTag(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.btnRemove:
                db.removePaper(id); // works fine
                data.remove(v.getTag()); // works fine
                notifyDataSetChanged(); // PROBLEM HERE: Does not refresh listview
                break;
            case R.id.btnFavorite:
                Toast.makeText(context, "Favorite" + v.getTag(), Toast.LENGTH_SHORT).show();
                break;

        }

    }
}

前段时间我遇到了类似的问题,我修复了扩展 ArrayAdapter<MyObject> 而不是 BaseAdapter 并覆盖了一些方法:

public class CustomAdapter extends ArrayAdapter<MyObject> {

private List<MyObject> list = new ArrayList<MyObject>();

public CustomAdapter(Context context, int resource) {
    super(context, resource);
}

 @Override
 public void add(MyObject obj) {
     this.list.add(obj);
     super.add(obj);
 }

 @Override
 public void remove(MyObject obj) {
     int i = getPosition(obj);
     if(i >= 0)
         list.remove(i);
     super.remove(obj);
 }

 @Override
 public void clear() {
     this.list.clear();
     super.clear();
 }

 @Override
 public MyObject getItem(int position) {
     return this.list.get(position);
 }

 @Override
 public int getPosition(MyObject obj) {
     for(int i = 0; i < list.size(); i++) {
         if(list.get(i).equals(obj))
             return i;
     }
     return -1;
 }}

然后调用这些方法而不是直接调用列表的方法。