数据库更新后,在Listfragment中刷新列表视图

时间:2013-01-20 06:48:56

标签: android android-listview

我使用相同的活动进行保存和编辑。我有一个列表视图。

在List片段中我有

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        if(dbHelper != null){
            Item item = (Item) this.getListAdapter().getItem(position);
            Intent intent = new Intent(getActivity(), SaveEditActivity.class);
            intent.putExtra("Update_Item", item);
            startActivity(intent);
        }
    }

现在在SaveEditActivity我有

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(....);
        Intent intent = getIntent();
        if(intent.hasExtra("Update_Item")){
            Item item = (Item) intent.getSerializableExtra("Update_Item");
            if(item != null){
                this.isEdit = true;
                this.editedItem = item;
                setItemData(item); // set the data in activity
            }
        }
}

现在,当用户点击保存按钮时,我会检查isEdit标志

 if(isEdit == true){
        updateItem();//update
     }else{
      saveItem(); // add
     }
 }

在Update方法中,我使用editedItem Object

更新数据库中的项目
private void updateItem(){
      if(this.editedItem != null){
          dbHelper.updateItem(editedItem);
      }
    }

但是我的列表视图没有刷新新数据。

我使用customAdapter扩展BaseAdapter

在ListFragmet中,我将数据加载到onResume()方法

中的适配器中
@Override
    public void onResume() {
        super.onResume();
        dbHelper = new DatabaseHandler(getActivity());
        List<Item> existingItems = dbHelper.getItemData();
        adapter = new CustomAdapter(getActivity().getApplicationContext(), existingItems);
        if(adapter != null){
           this.setListAdapter(adapter);
           adapter.notifyDataSetChanged();
        }
    }

现在从活动返回时,应调用此方法,并应通知适配器更改?不是吗?

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

不知何故,您必须通知您的ListView数据集已更改/更新,以便它自行刷新。在我的一个应用中,我使用了Observer界面&amp; Observable类来观察数据是否发生了变化。这有助于我解决这个问题。

您可以使用的想法是每次更新/保存更改的数据集,因此在执行此操作后,您应该调用名为notifyDataSetChanged()的方法

/* don't be confuse with this method's name, Its a custom method. I
   used this name. You may use another like myAbcdMethod() :) */
private void notifyDataSetChanged() {
    setChanged();
    notifyObservers(new Boolean(true));
}

notifyDataSetChanged()是一种私有方法,&amp;你应该在你的DbHelper中实现它。每次edit.save之后你都可以调用它。

在您的活动中,您应该使用以下内容刷新列表:

    @Override
    public void update(Observable observable, Object data) {
        isDataChanged = (Boolean) data;
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        if (isDataChanged) {
            adapter.clear();
            adapter.refresh(screenNames.toArrayList());
            adapter.notifyDataSetChanged();
            isDataChanged = false;
        }
    }

这适用于多个活动应用的单个活动应用。