![](/img/trans.png)
[英]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.