android - 数据库更新后刷新 Listfragment 中的 ListView

标签 android android-listview

我使用相同的 Activity 进行保存和编辑。我有一个 ListView 。

在列表 fragment 中我有

@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 对象更新数据库中的项目

private void updateItem(){
      if(this.editedItem != null){
          dbHelper.updateItem(editedItem);
      }
    }

但是我的 ListView 没有用新数据刷新。

我正在使用扩展 BaseAdaptercustomAdapter

在 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();
        }
    }

现在从 Activity 返回时应该调用此方法并通知适配器更改?对不对?

有人可以帮忙吗?

最佳答案

您必须以某种方式通知您的 ListView 数据集已更改/更新,以便它应该自行刷新。在我的一个应用程序中,我使用了 Observer 接口(interface)和 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() 是一个私有(private)方法,您应该在 DbHelper 中实现它。每次 edit.save 之后你都可以调用它。

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

    @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;
        }
    }

这适用于单 Activity 应用到多 Activity 应用。

关于android - 数据库更新后刷新 Listfragment 中的 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14422352/

相关文章:

java - 您可以使用空间而不使用 LiveData 对象吗?

android - ListView onClick更新清除列表

android - 将滤镜效果应用于 Gallery 中的 Android ImageView

android - 根上的 Firebase 引用查询

java - 地理围栏在 Kotlin 中不起作用

Android 谷歌地图 API : How to get minimum and maximum coordinate can visible on map

java - 无法理解如何从适配器将数据插入列表中

java - 从自定义 ListView 中删除项目的问题

android - 自定义线性布局android中的多项选择问题

android - 如何为 Android 4.0 创建 AVD