簡體   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