在 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
没有立即刷新,但当我移动到另一个片段并返回时发生变化?
我的CustomAdapter
class如下:
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;
}}
然后调用这些方法而不是直接调用列表的方法。
我有 ArrayList<MyObject> data
使用 CustomAdapter
.
ListView
上填充
我在 CustomAdapter
class 中实现了 View.OnClickListener
,单击按钮删除特定行。在自定义适配器中使用 data.remove(i)
从数据库和 data
对象删除行后,我调用 notifyDataSetChanged()
.
问题是它不刷新ListView
。
我正在使用带有片段的选项卡 activity。因此,当转到某个遥远的选项卡并返回此选项卡时,它会刷新 ListView
并且已删除的项目不再显示。
为什么当我调用 notifyDataSetChanged()
时 ListView
没有立即刷新,但当我移动到另一个片段并返回时发生变化?
我的CustomAdapter
class如下:
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;
}}
然后调用这些方法而不是直接调用列表的方法。