[英]ListView with customAdapter not updated when notifyDataSetChanged is called?
[英]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.