ListView 仅在应用程序再次重新启动时更新条目

ListView updates the entry only when the application is restarted again

在这个应用程序中,我有一个 listview 和一个 sqlitedatabase。有一个 floating action button,单击它会显示一个 dialog box,其中包含两个 edittext,一个用于名称,另一个用于编号。问题是单击 dialog boxadd 选项后,条目未显示在 listview 上。但是当 activity 被销毁并在 activity 上再次调用 onCreate 时,将显示该条目。

我尝试使用 adapter.notifyDataSetChanged() 但它不起作用。代码如下所示:

代码

public class DetailsActivity extends AppCompatActivity {

private DatabaseManager manager;
private ListView listView;
private SimpleCursorAdapter adapter;

final String[] from=new String[] {UserDatabase.NAME,UserDatabase.NUMBER};

final int[] to=new int[] {R.id.nameDisplay,R.id.phoneDisplay};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    manager = new DatabaseManager(getApplicationContext());
    manager.open();
    Cursor cursor=manager.fetch();

    listView = (ListView) findViewById(R.id.listViewId);
    listView.setEmptyView(findViewById(R.id.empty));

    adapter = new SimpleCursorAdapter(getApplicationContext(),
            R.layout.row_item, cursor, from, to, 0);
    adapter.notifyDataSetChanged();

    listView.setAdapter(adapter);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(DetailsActivity.this);
            LayoutInflater inflater = DetailsActivity.this.getLayoutInflater();
            final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
            dialogBuilder.setView(dialogView);
            final EditText name = (EditText) dialogView.findViewById(R.id.dialogEditNmID);
            final EditText phone = (EditText) dialogView.findViewById(R.id.dialogEditPhID);

            dialogBuilder.setTitle("Add Details");
            dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (!TextUtils.isEmpty(name.getText().toString()) &&
                            !TextUtils.isEmpty(phone.getText().toString())) {
                        /*adapter.notifyDataSetChanged();
                        manager.insert(name.getText().toString(), phone.getText().toString());
                        Toast.makeText(getApplicationContext(),
                                "Added " + name.getText().toString(), Toast.LENGTH_SHORT).show();*/
                        insertData(name.getText().toString(),phone.getText().toString());
                    } else {
                        Toast.makeText(getApplicationContext(),
                                "Empty field(s)", Toast.LENGTH_SHORT).show();
                    }

                }
            });

            dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            AlertDialog b = dialogBuilder.create();
            b.show();
            //  listView.setAdapter(adapter);
            //adapter.notifyDataSetChanged();
        }
    });
}

public void insertData(String fname,String phnumber){
    manager.insert(fname,phnumber);
    listView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}
}

有些语句被注释了,因为我试图得到想要的结果却得不到。

插入操作后尝试使用notifyDataSetChanged。在所有你打电话的地方(试着打电话)通知经理数据还没有改变。

我对代码做了一些修改,请尝试一下,如果有帮助请告诉我

public class DetailsActivity extends AppCompatActivity {

private DatabaseManager manager;
private ListView listView;
private SimpleCursorAdapter adapter;

final String[] from=new String[] {UserDatabase.NAME,UserDatabase.NUMBER};

final int[] to=new int[] {R.id.nameDisplay,R.id.phoneDisplay};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    manager = new DatabaseManager(getApplicationContext());
    manager.open();


    listView = (ListView) findViewById(R.id.listViewId);
    listView.setEmptyView(findViewById(R.id.empty));
    adapter = new SimpleCursorAdapter(getApplicationContext(),R.layout.row_item, cursor, from, to, 0);
    //adapter.notifyDataSetChanged();

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(DetailsActivity.this);
            LayoutInflater inflater = DetailsActivity.this.getLayoutInflater();
            final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
            dialogBuilder.setView(dialogView);
            final EditText name = (EditText) dialogView.findViewById(R.id.dialogEditNmID);
            final EditText phone = (EditText) dialogView.findViewById(R.id.dialogEditPhID);

            dialogBuilder.setTitle("Add Details");
            dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (!TextUtils.isEmpty(name.getText().toString()) &&
                            !TextUtils.isEmpty(phone.getText().toString())) {
                        adapter.notifyDataSetChanged();
                        manager.insert(name.getText().toString(), phone.getText().toString());
                        Toast.makeText(getApplicationContext(),
                                "Added " + name.getText().toString(), Toast.LENGTH_SHORT).show();

                        Cursor cursor = manager.fetch();

                        listView.setAdapter(adapter);
                    } else {
                        Toast.makeText(getApplicationContext(),
                                "Empty field(s)", Toast.LENGTH_SHORT).show();
                    }

                }
            });

            dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            AlertDialog b = dialogBuilder.create();
            b.show();
            //  listView.setAdapter(adapter);
            //adapter.notifyDataSetChanged();
        }
    });
}}

将条目插入数据库后,您应该再次获取数据,以便您的列表具有最新的条目。因此,您可以修改代码以便能够将数据点添加到要传递给适配器的列表中,或者在插入之后和 notifyDatasetChanged() 之前从数据库中重新获取数据。

这里有几处您必须更改。看看这段代码:

dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (!TextUtils.isEmpty(name.getText().toString()) && !TextUtils.isEmpty(phone.getText().toString())) {
            adapter.notifyDataSetChanged();
            manager.insert(name.getText().toString(), phone.getText().toString());
            Toast.makeText(getApplicationContext(), "Added " + name.getText().toString(), Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getApplicationContext(), "Empty field(s)", Toast.LENGTH_SHORT).show();
        }
    }
});
  1. 当您单击 "Add" 按钮时,您会立即调用 adapter.notifyDataSetChanged();。在您的情况下,您应该只在向 listView 添加项目后调用它,但您还没有添加任何内容。
  2. 您使用 manager.insert(name.getText().toString(), phone.getText().toString()); 插入到数据库中,但没有使用新添加的数据更新 listView。您需要将该数据插入数据库,然后将该数据添加到 listView.

现在您可以调用 adapter.notifyDataSetChanged();.

我建议当您想插入数据库时​​,创建一个方法来插入数据,将新数据添加到 listView,然后告诉适配器刷新。

编辑

关于您最近的编辑,还有一些事情需要注意。

  1. 方法中不应包含 listView.setAdapter(adapter)。您第一次就做对了(在 onCreate() 中但在对话框生成器之前)。
  2. 你调用了manager.insert(fname,phnumber);,但仍然没有将新插入的数据添加到listView

这是您的方法中应该包含的伪代码:

public void insertData(String fname,String phnumber){
    manager.insert(fname,phnumber);
    // Code to add the data you just inserted into the manager above to `listView`.
    adapter.notifyDataSetChanged();
}

请记住,如果 listView 发生变化,adapter.notifyDataSetChanged(); 只会更新 listView,而目前您还没有 added/deleted/modified listView