繁体   English   中英

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

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

我有ArrayList<MyObject> data ,该ArrayList<MyObject> data使用CustomAdapter填充在ListView

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

问题是它不会刷新ListView

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

为什么当我调用notifyDataSetChanged()ListView不会立即刷新,但是当我移至另一个片段并返回notifyDataSetChanged()发生变化?

我的CustomAdapter类如下:

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;
 }}

然后调用这些方法,而不是直接调用List的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM